題目:在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。
一種直觀的思路是通過暴力破解的方法,時間複雜度為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...