劍指offer 35 陣列中的逆序數對

2021-10-10 23:42:57 字數 1348 閱讀 4263

方法一(超時):暴力解法。每次找到最小值和其位置,逆序數+=其下標,然後剔除最小值。

方法二:歸併排序。[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...