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

2021-08-27 18:19:38 字數 1656 閱讀 8429

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

對於逆序對的問題,首先最容易想到的就是暴力窮舉的方法。然而在題目中n的取值非常大,遍歷的時間複雜度為o(n^2), 可見時間複雜度還是很高的,那麼怎麼才能解決這個問題呢?

我們可以根據改進一下歸併排序的演算法,先回憶一下歸併排序的基本思想:我們把乙個陣列分成兩部分,然後對這兩部分遞迴的進行歸併排序,然後對歸併排序好的兩部分進行歸併,所以歸併的時間複雜度為o(nlogn). 因為我們想統計陣列中的逆序對數目,那麼我們可以先將陣列分成兩部分,然後對兩個陣列遞迴統計逆序對的數目,然後統計出來兩個陣列間的逆序對數目(即左邊陣列中的數大於右邊陣列中的數的總對數)。根據以上分析我們的**如下:

import math

class solution:

def inversepairs(self, data):

# write code here

count = 0

if len(data)==1:

return 0

if len(data) == 2:

if data[0]>data[1]:

return 1

else:

return 0

if len(data) > 2:

mid = math.floor((len(data)-1)//2)

data_l = data[:mid]

data_r = data[mid:]

data_sorted_l = sorted(data_l)

data_sorted_r = sorted(data_r)

for i in range(len(data_sorted_r)):

for j in range(len(data_sorted_l)):

if data_sorted_l[j] > data_sorted_r[i]:

count += 1

return (count + self.inversepairs(data_l)+self.inversepairs(data_r))%1000000007

if __name__ == '__main__':

s = solution()

data1 = [364,637,341,406,747,995,234,971,571,219,993,407,416,366,315,301,601,650,418,355,460,505,360,965,516,648,727,667,465,849,455,181,486,149,588,233,144,174,557,67,746,550,474,162,268,142,463,221,882,576,604,739,288,569,256,936,275,401,497,82,935,983,583,523,697,478,147,795,380,973,958,115,773,870,259,655,446,863,735,784,3,671,433,630,425,930,64,266,235,187,284,665,874,80,45,848,38,811,267,575]

print (s.inversepairs(data1))

劍指offer陣列中的逆序對數

今天的第二道題目,因為自己第一次做類似的題目,能力有限,參考了題解中優秀的解法,上題 題目描述 在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。即輸出p 1000000007 輸...

劍指offer 陣列中的逆序對

在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。解法一 乙個數字能不能構成逆序對,關鍵看後面有幾個比他小的數字。根據這個思路,我們可以從後向前遍歷整個陣列。並用乙個大小為10的陣列,分別來儲存從後向前遍歷陣列時0 9每個數字...

劍指offer 陣列中的逆序對

題目描述 在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。class solution vector tmp len int res mergesort data,tmp,0,len 1 return res private...