在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。 即輸出p%1000000007
同樣首先想到的是暴力破解的方法,但是暴力破解的時間複雜度太高了。於是進一步的想到歸併的方法。前面又乙個題目是求陣列的和最大的子陣列,使用的也是歸併的方法。所以套用歸併的思路,可以用如下步驟求解陣列的逆序數。
1)將陣列以中間節點mid為邊界,劃分成兩個陣列[start,mid]和[mid+1,end]。
2)分別計算左右兩個子陣列的逆序數,計算完成後,將左右兩個陣列按照公升序排序。
3)對比左右兩個子陣列之間的數的大小,就能夠很快速的計算出合併後陣列中的逆序數。
具體的解題思路可以看劍指offer中的說明。反正我是想了好久才明白這個思路。不過我覺得還是直接看**好懂一些。這裡的**有一處需要特別的注意,那就是計算子陣列合併後的逆序數的時候,是基於已經排序後的子陣列進行操作的。所以傳值的時候一定要注意自己引用的陣列是不是排序後的陣列。
class solution
long inversepairs(vector
&data, vector
©, long start, long end)
else
}while(pleft >= start)
while(pright >= mid+1)
return (left + right + cnt) % 1000000007;
}};
劍指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就加上後乙...