在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。示例:
輸入:[7
,5,6
,4]輸出:
5
先說自己想法:暴力法先來一遍,嗯…超時了!!!不知所措的我開啟了題解,前面又是一片光明!!!
**就是在歸併排序的基礎上新增了乙個計數變數,當合併兩個子陣列時,如果左邊的子陣列中值大於右邊子陣列的值,那麼左邊子陣列中的元素個數就是逆序對的個數。所以,就很容易想到把這點**加到**了。
class
solution
private
intmerge
(int
nums,
int start,
int end)
int mid = start +
(end - start)/2
;int count =
merge
(nums, start, mid)
+merge
(nums, mid +
1, end)
;int i = start, j = mid +
1, k =0;
int[
] temp =
newint
[end - start +1]
;while
(i <= mid && j <= end)
while
(i <= mid)
while
(j <= end)
// 這一步是把排序好的部分填到原來陣列中
for(
int c =
0; c < k; c++
)return count;
}}
面試題51 陣列中的逆序對
在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。例如在陣列中,一共存在5個逆序對,分別是 7,6 7,5 7,4 6,4 5,4 看到這道題目,第一反應是順序掃瞄整個陣列,沒掃瞄到乙個數字,逐個比較該數字和它後面數字的大小,...
面試題51 陣列中的逆序對
題目 在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。即輸出p 1000000007 看到這個題目,我們的第一反應是順序掃瞄整個陣列。每掃瞄到乙個陣列的時候,逐個比較該數字和它後...
面試題51 陣列中的逆序對
在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。很容易想到從後往前折半插入排序時順便記錄比當前數小得數,但是這種方法在用例30的時候就超時了。class solution nums ed tmp return ed st 1...