問題:在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數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...