題目描述
在陣列中的兩個數字如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。
輸入乙個陣列,求出這個陣列中的逆序對的總數。
樣例
輸入:[1,2,3,4,5,6,0]
輸出:6
思路
注:圖中省略了最後一步, 即複製第二個子陣列最後剩餘的4 到輔助陣列中。**(a) p
1p_1
p1指向的數字大於p
2p_2
p2指向的數字,表明陣列中存在逆序對。p
2p_2
p2 指向的數字是第二個子陣列的第二個數字, 因此第二個子陣列中有兩個數字比7 小。把逆序對數目加2,並把7 複製到輔助陣列,向前移動p
1p_1
p1和p
3p_3
p3。
(b) p
1p_1
p1指向的數字小子p
2p_2
p2 指向的數字,沒有逆序對。把p
2p_2
p2 指向的數字複製到輔助陣列,並向前移動p
2p_2
p2 和p
3p_3
p3
1p_1
p1指向的數字大於p
2p_2
p2 指向的數字,因此存在逆序對。由於p
2p_2
p2 指向的數字是第二個子陣列的第乙個數字,子陣列中只有乙個數字比5 小。把逆序對數目加1 ,並把5複製到輔助陣列,向前移動p
1p_1
p1和p
3p_3
p3 。
class
solution
}int
getcount
(vector<
int>
& nums,
int begin,
int end)
// 不存在交叉的逆序對,依次將較大值放進輔助陣列
else
}while
(i >= begin)
while
(j > mid)
//更新歸併排序後的子陣列
for(
int i = begin; i <= end;
++i)
nums[i]
= copy[i]
;return
(leftcount+rightcount+crosscount);}
};
劍指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就加上後乙...