方法一(超時):暴力解法。每次找到最小值和其位置,逆序數+=其下標,然後剔除最小值。
方法二:歸併排序。[87654321],分成兩個陣列[8765]和[4321]每個陣列的內部的逆序數對都是4,併排好序 [5678],[1234].然後合併他們得到[56781234]的逆序數對並排序。
最終的逆序數對就是最大的兩個區間合併起來算出的逆序數對。
# -*- coding:utf-8 -*-
class
solution
:def
__init__
(self)
: self.cnt =
0def
merge
(self,data,start,mid,end)
: temp =
i = start
j = mid +
1while i<=mid and j<=end:
if data[i]
<=data[j]:)
i+=1else
: self.cnt+=mid-i+1)
j+=1if i<=mid:
while i<=mid:
) i+=
1if j<=end:
while j<=end:
) j+=
1for n in
range
(len
(temp)):
data[start+n]
= temp[n]
defmergesort
(self,data,start,end)
:if start>=end:
return
mid =
(start+end)
>>
1 self.mergesort(data, start, mid)
self.mergesort(data, mid+
1, end)
self.merge(data, start, mid, end)
definversepairs
(self, data)
:# write code here
ifnot data:
return0if
len(data)
<2:
return
0 self.mergesort(data,0,
len(data)-1
)return self.cnt%
1000000007
劍指offer35 陣列中的逆序對
題目描述 在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。即輸出p 1000000007 輸入描述 題目保證輸入的陣列中沒有的相同的數字 資料範圍 對於 50的資料,size 1...
劍指Offer(35) 陣列中的逆序對
在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。即輸出p 1000000007。例如輸入,輸出5對。分治思想,採用歸併排序的思路來處理。在合併兩個有序序列時,同時計算逆序對數。對...
劍指Offer 35 陣列中的逆序對
題目描述 在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。即輸出p 1000000007 輸入描述 題目保證輸入的陣列中沒有的相同的數字 資料範圍 對於 50的資料,size 1...