這道題隱含的思想是二分法和歸併排序。
classsolution
long
long inversepairscore(vector &data,vector ©,int start,int
end)
int length=(end-start)/2
;
long
long left=inversepairscore(copy,data,start,start+length);
long
long right=inversepairscore(copy,data,start+length+1
,end);
int i=start+length;
int j=end;
int indexcopy=end;
long
long count=0
;
while(i>=start&&j>=start+length+1
)
else
}for(;i>=start;i--)
copy[indexcopy--]=data[i];
for(;j>=start+length+1;j--)
copy[indexcopy--]=data[j];
return left+right+count;
}};
交換copy和data是因為:
1.在每次的操作中,數值的比較都是採用當前傳入函式中第一項,也就是data;比較的結果都存放到copy中;也就意味著此時copy中是經過此次呼叫的結果。
2.從最底層返回時,進入了(start == end)的情形,data 和 copy 完全沒有修改,此時copy和data還是一樣的。
3.進入倒數第二層時,程式進入上圖26行以後部分,copy是部分排序後的新陣列,data是舊陣列。注意這裡都是傳值的呼叫,陣列都是直接修改的。
倒數第二層使用的copy其實是倒數第三層中的data,這就確保了倒數第三層進入26行以後時,資料比較使用的data是最新排序的陣列。
4. 倒數第三層將排序的結果存入copy中。程式在倒數第四層進入26行後,使用的data陣列為剛剛倒數第三層中的最新排序的copy.
5. 也就是說,在每次程式進入26行時,此時的data是最新的排序結果,copy是次新的結果。
在最後一次進入26行以後時,copy為完整排序後的結果,data是次新的結果。
然而這裡第乙個類內函式呼叫第二個函式時,data和copy的順序沒有改變,所以最後結果應該copy是完整排序的結果.data是差一步完成排序的結果。以輸入[7,5,6,4], 最後的結果copy[4,5,6,7], data[5,7,4,6].
劍指offer 陣列中的逆序對
在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。解法一 乙個數字能不能構成逆序對,關鍵看後面有幾個比他小的數字。根據這個思路,我們可以從後向前遍歷整個陣列。並用乙個大小為10的陣列,分別來儲存從後向前遍歷陣列時0 9每個數字...
劍指offer系列 陣列中逆序對
題目描述 輸入乙個陣列,求出其中逆序對的總個數 示例 輸入 逆序對有,幾種情況 因此輸出5 分析 利用歸併排序的思想進行排序,時間複雜度o nlgn int inversepairscore vector nums,vector copy,int begin,int end int mid begi...
劍指offer 陣列中的逆序對
題目描述 在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。class solution vector tmp len int res mergesort data,tmp,0,len 1 return res private...