在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。 即輸出p%1000000007
輸入描述:
題目保證輸入的陣列中沒有的相同的數字示例1資料範圍:
對於%50的資料,size<=10^4
對於%75的資料,size<=10^5
對於%100的資料,size<=2*10^5
輸入1,2,3,4,5,6,7,0輸出7
typedef
long
long ll;
class
solution
ll amountofinversepairs
(vector<
int>
&mdata, vector<
int>
&mcopy,
int mstart,
int mend)
ll halflength =
(mend - mstart)/2
; ll left =
amountofinversepairs
(mcopy, mdata, mstart, mstart + halflength)
;// 重要!(引數順序)
ll right =
amountofinversepairs
(mcopy, mdata, mstart + halflength +
1, mend)
;
ll i = mstart + halflength;
ll j = mend;
ll indexofmcopy = mend;
ll mcount =0;
while
(i >= mstart && j >= mstart + halflength +1)
else
}while
(i >= mstart)
mcopy[indexofmcopy--
]= mdata[i--];
while
(j >= mstart + halflength +1)
mcopy[indexofmcopy--
]= mdata[j--];
return left + right + mcount;}}
;
注意:需要用long long
型別資料,另外不要忘記對結果取模。
這裡只解釋下為什麼需要「交換mdata和mcopy」:
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].
下面是自己的理解:
我們的目的就是讓mdata左右部分有序,然後在合併mdata左右部分的過程中統計逆序對數目。。。。我們在左右遞迴的過程中,其實可以理解為 參照mcopy來對mdata進行排序,使其左右部分有序。。。。所以我們需要交換引數順序
51 陣列中的逆序對
面試題51.陣列中的逆序對 在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。示例 1 輸入 7,5,6,4 輸出 5 限制 0 陣列長度 50000 在歸併排序中進行處理 class solution private voi...
51題陣列中的逆序對
題目描述 在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。即輸出p 1000000007 思路 使用了歸併排序的思想 class solution else if m start...
51 陣列中的逆序對 python
題目 在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對。def inverse pairs arrys if len arrys 2 return 0 res 0 length len arrys arrys sort sorted...