九章演算法 網易面試題 逆序對

2021-10-19 13:34:08 字數 1610 閱讀 4629

描述

在陣列中的兩個數字如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。給你乙個陣列,求出這個陣列中逆序對的總數。

概括:如果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 是波峰,則...