在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數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 ...