劍指Offer51 陣列中的逆序對

2021-10-22 11:48:21 字數 900 閱讀 7817

1.歸併排序:時間o(nlogn),空間o(n)

分:將整個區間查詢逆序對分成左右子區間的問題,整個區間[l,r]的逆序對數 = 左區間[l,mid]的逆序對數 + 右區間[mid,r]的逆序對數 + 左右區間各乙個數的逆序對數;

治(合併階段): 本質上是 合併兩個排序陣列 的過程,而每當遇到 左子陣列當前元素 > 右子陣列當前元素 時,意味著 「左子陣列當前元素 至 末尾元素」 與 「右子陣列當前元素」 構成了若干 「逆序對」

總的思路就是在歸併排序的基礎上,在合併兩個排序左右區間之前,先求區間的逆序對數,再合併成乙個排序區間;

class

solution

}//前面先對未歸併的區間[l, mid],[mid + 1, r]累計逆序對數量res;其實[l, mid]和[mid + 1, r]已經有序了,之所以改變了陣列順序依然不影響逆序對,是因為逆序對的兩個數均在左邊[l, mid]和均在右邊[mid + 1, r]的已經算完了,該層函式只需要在左右區間有序的基礎上,求兩邊各乙個數的逆序對,假設左區間有個數q[i]>右區間某個數q[j],則無論q[i]和q[j]在各自區間的哪個位置,都一定是一組逆序對

//再完成排序

while

(i <= mid) tmp[k++

]= nums[i++];

while

(j <= r) tmp[k++

]= nums[j++];

for(i = l, k =

0; i <= r;

) nums[i++

]= tmp[k++];

return res;

}int

reversepairs

(vector<

int>

& nums)

};

劍指Offer 51 陣列中的逆序對

在陣列中的兩個數字如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。樣例輸入 1,2,3,4,5,6,0 輸出 6 class solution object definversepairs self,nums type nums list in...

劍指offer 51 陣列中的逆序對

這到題的題目為 陣列中的兩個數字如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這兩個陣列中逆序對的總數。解題思路 將陣列分為若干個子陣列,其中每乙個數為乙個子陣列,先統計子陣列內部之間的逆序對,並對它們進行排序。然後統計相鄰兩個子陣列之間的逆序對用於對它們進行排序,直...

劍指offer51 陣列中的逆序對

在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。即輸出p 1000000007 輸入描述 題目保證輸入的陣列中沒有的相同的數字 資料範圍 對於 50的資料,size 10 4對於...