劍指offer35 陣列中的逆數對

2021-10-23 13:52:00 字數 717 閱讀 8221

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

一種直觀的思路是通過暴力破解的方法,時間複雜度為o(n*n)。除此以外,我們還可以借鑑歸併排序的思想來求解逆數對。

歸併排序在合併陣列的時候回比較前後兩個陣列元素的大小,在這個時候就可以得到每個元素的逆序對second-mid,時間複雜度為o(nlogn)。

注:1.cnt之所以是second-mid,是因為每當左陣列的某乙個元素排序時,在它前面進入temp元素的必然比它小,這個元素可以和之前進入temp的每乙個元素組成逆序對,總共有second-mid對。

2.在歸併排序時,每次改變的只是left到right的一部分,所以temp和num的改變範圍都是l到r。

int

reversepairs

(vector<

int>

& nums)

void

merge_sort

(vector<

int>

&num,vector<

int>

&temp,

int l,

int r,

int&cnt)

else

}for

(int i=l;i++i)

num[i]

=temp[i]

;}

劍指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...