ATO 51 陣列中的逆序對

2021-09-29 22:58:01 字數 2229 閱讀 3395

在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。 即輸出p%1000000007

輸入描述:

題目保證輸入的陣列中沒有的相同的數字

資料範圍:

對於%50的資料,size<=10^4

對於%75的資料,size<=10^5

對於%100的資料,size<=2*10^5

示例1

輸入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...