如果兩個區間為[4, 3] 和[1, 2]
那麼逆序數為(4,1),(4,2),(3,1),(3,2),同樣的如果區間變為有序,比如[3,4] 和 [1,2]的結果是一樣的,也就是說區間有序和無序結果是一樣的。
但是如果區間有序會有什麼好處嗎?當然,如果區間有序,比如[3,4] 和 [1,2]
如果3 > 1, 顯然3後面的所有數都是大於1, 這裡為 4 > 1, 明白其中的奧秘了吧。所以我們可以在合併的時候利用這個規則。
public
int count =0;
public
intinversepairs
(int
array)
private
void
mergesort
(int
array,
int left,
int right)
int mid =
(left+right)/2
;mergesort
(array,left,mid)
;mergesort
(array,mid,right)
;merge
(array,mid,left,right);}
private
void
merge
(int
array,
int mid,
int left,
int right)
else
}while
(cur1
while
(cur2
for(
int i =
0;i)}
劍指offer 陣列中的逆序對
在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。解法一 乙個數字能不能構成逆序對,關鍵看後面有幾個比他小的數字。根據這個思路,我們可以從後向前遍歷整個陣列。並用乙個大小為10的陣列,分別來儲存從後向前遍歷陣列時0 9每個數字...
劍指offer 陣列中的逆序對
題目描述 在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。class solution vector tmp len int res mergesort data,tmp,0,len 1 return res private...
劍指offer 陣列中的逆序對
在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。分析 類似於mergesort的思想,對於兩個排序的陣列,用兩個指標分別指向末尾,比如p,q,如果p的值大於q,那麼p與q和q之前所有數字都可以組成逆序對,count就加上後乙...