陣列中的逆序對

2021-09-26 02:21:21 字數 1147 閱讀 1462

題目描述

在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。即輸出p%1000000007

思路:實際上是乙個分治問題,不斷將陣列一分為二,直到陣列中只有兩個元素,統計逆序對個數,分別排序後進行合併,merge的時候計算合併的兩個陣列間的逆序對個數。類似歸併排序的過程。

def inversepairs(self, data):

# write code here

if len(data) == 0:

return 0

def mergesort(data, begin, end):

if begin == end - 1:

return 0

mid = int((begin + end) / 2)

left_count = mergesort(data, begin, mid)

right_count = mergesort(data, mid, end)

merge_count = merge(data, begin, mid, end)

return left_count + right_count + merge_count

def merge(data, begin, mid, end):

i = begin

j = mid

count = 0

temp =

while i < mid and j < end:

if data[i] <= data[j]:

i += 1

else:

j += 1

count += mid - i

while i < mid:

i += 1

while j < end:

j += 1

data[begin: end] = temp

del temp

return count

begin = 0

end = len(data)

ans = mergesort(data, begin, end)

return ans % 1000000007

陣列中逆序對

題目 在陣列中的兩個數字,如果前面的乙個數字大於後面的數字,則這兩個數字為乙個逆序對。輸入乙個陣列,求這個陣列的逆序對個數。例如 給定陣列 則有 5,3 5,1 8,3 8,1 3,1 這5個逆序對。問題分析 我採用兩種方法來解決這個問題 1 考慮到二叉搜尋樹中每個節點x,它的左子樹所有關鍵字的值小...

陣列中的逆序對

來自劍指offer 分析 我們第一反應是順序掃瞄整個陣列,每掃瞄到乙個數字時,逐個比較該數字和它後面的數字的大小。如果後面的數字比它小,則這個兩個數字就組成了乙個逆序對。假設陣列有n個數字,由於每個數字都要和o n 個數字作比較,因此這個演算法的時間複雜度為o n 2 換思路 我們採用歸併思想,先考...

陣列中的逆序對

題目 在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。用歸併排序演算法,歸併的時候,從後向前歸併。include using namespace std int getreversenum int p1,int p2,int...