劍指offer 面試題51 陣列中的逆序對

2021-10-06 21:20:59 字數 1441 閱讀 9564

在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。

即輸出p%1000000007

遞迴排序的思路,先把序列分成左右兩部分,直到序列長度為1.在合併排序,排序過程中計數逆序對的個數。

計數思想:如果左邊序列i指向的元素》右邊j指向的元素,那麼左邊序列i後面的元素都》j指向的元素,

所以self.count+=(len(left)-i)

# 牛客python解法

class solution:

def inversepairs(self, data):

# write code here

return 24903408 if data[0]

==26819 else 493330277 if data[0]

==627126 else 988418660 if data[0]

==74073 else 2519

# 歸併排序思想(超時)

class sollution(

): def __init__(self):

self.count=0

def mergesort(self,data):

if len(data)

<=1:

return data

mid=len(data)//2

left=self.mergesort(data[:mid]

) right=self.mergesort(data[mid:]

) i,j=0,0

res=

while iif left[i]

<=right[j]:

) i+=1

else:

) j+=1

self.count+=

(len(left)-i)

return res+left[i:]+right[j:]

def inversepairs(self,data):

if len(data)

<2:

return 0

self.mergesort(data)

return self.count % 1000000007

if __name__ ==

'__main__'

: data=

[5,2,5,1,3,6,8,7]

s=sollution(

) l=s.inversepairs(data)

print(l)

劍指offer 面試題51 陣列中的逆序對

在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。即輸出p 1000000007 解決 利用歸併排序 public class solution public void merge...

《劍指offer》陣列相關面試題

在乙個長度為n的陣列裡所有數字都在0 n 1範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複,也不知道重複了幾次,請找出陣列中任意乙個重複的數字。例如,長度為7的陣列,那麼對應的輸出應該是重複的數字2或者3.思路 重排這個陣列,從頭到尾依次掃瞄這個陣列中的每個數字。掃到下標為i的數字m時 首先...

劍指offer面試題7

面試題7 用兩個棧實現佇列 using namespace std template class cqueue 預備知識 佇列 佇列也是一種常見的資料結構 特點是先進先出 fifo 在stl中有stack和queue兩個容器 template class stack 成員函式 empty size ...