描述
在陣列中的兩個數字如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。給你乙個陣列,求出這個陣列中逆序對的總數。
概括:如果a[i] > a[j] 且 i < j, a[i] 和 a[j] 構成乙個逆序對。
lintcode 領扣
樣例1
輸入: a = [2, 4, 1, 3, 5]
輸出: 3
解釋:
(2, 1), (4, 1), (4, 3) 是逆序對
樣例2
輸入: a = [1, 2, 3, 4]
輸出: 0
解釋:
沒有逆序對
利用歸併排序的思想求逆序對,複雜度o(nlogn) 當然也可以用樹狀陣列或者線段樹求解
class
solution:#
@paramaan
array
#@return
total
ofreverse
pairs
defreversepairs
(self,a
):#write
your
code
here
self
.tmp=[
0]*len(a
)return
self
.mergesort(a
,0,len(a
)-1)
defmergesort
(self,a
,l,r
):if
l>=r:
return0m
=(l+
r)>>
1ans
=self
.mergesort(a
,l,m
)+self
.mergesort(a
,m+1
,r)i
,j,k
=l,m
+1,l
while
i<=
mand
j<=r:
ifa[i
]>a[
j]:self
.tmp[k
]=a[
j]j+=
1ans+=m
-i+1
else
:self
.tmp[k
]=a[
i]i+=
1k+=1
while
i<=m:
self
.tmp[k
]=a[
i]k+=
1i+=1
while
j<=r:
self
.tmp[k
]=a[
j]k+=
1j+=1
fori
inxrange(l
,r+1
):a[i
]=self
.tmp[i
]return
ans
更多題解參考:九章演算法
九章演算法 Google面試題 內積
描述 給定長度為n的a陣列,長度為k的b陣列 你可以從a陣列裡取k個數 規則如下 即每次可以從a陣列的最左邊或者最右邊取走乙個數,取走的數從陣列中移除 將取出的ai按取出的順序組成c陣列 求b與c的內積最大值 b與c內積為 i 0k 1bi ci 解釋1 a 1,4,3,2,5 b 1,2,3,4 ...
九章演算法面試題32 小球排序
有紅黃藍三色的小球若干排成一列,這些小球進行排序,請使用盡量少的空間和時間。假設順序為紅色黃色藍色。用兩根指標從頭開始遍歷,第一根指標遇到非紅色時停下,如果第二根指標找到第一根指標之後的第乙個紅色停下,交換兩根指標所指顏色。重複上述過程。直到第二根指標找不到任何紅色。此時第一根指標到最後都是黃色或藍...
九章演算法面試題33 陣列波峰
乙個陣列a 1.n 假設陣列中沒有任何相鄰兩數相等,滿足a 1 n。a i 被稱為波峰,當且僅當a i a i 1 並且a i a i 1 請找到陣列中的乙個波峰。假設陣列中存在相鄰相等的數,該怎麼做?根據條件a 1 a n 可知a中一定存在波峰。用二分法,選擇中點mid,如果a mid 是波峰,則...