劍指 Offer 51 陣列中的逆序對

2021-10-19 07:51:56 字數 1052 閱讀 6390

在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。

示例 1:

輸入: [7,5,6,4]

輸出: 5

限制:0 <= 陣列長度 <= 50000

記得以前是用樹狀陣列寫的,這次換個新解法----歸併排序

利用歸併排序特有的部分有序性質來解決逆序對問題

舉例:83691472

可以拆成

8369 1472

83 69 14 72

8 3 6 9 1 4 7 2

然後合併

38  69 14 27

3689 1247

12346789

這裡就是歸併排序的簡單實現,不會的可以先去學下歸併排序

可以假設前面是排好序的陣列a,後面是排好序的陣列b,利用指標i , j 指向a ,b

我們可以發現當 j指向的值先進佇列時,因為逆序對是比自身小的後面的數

所以 j 指向的數可以與a陣列中目前剩餘的所有數都組成逆序對

可以思考一下,這樣遍歷完就是陣列a+b的所有逆序對的總數。

所以完全可以在歸併排序的自下而上的 歸 過程中逐步得到所有的逆序對

具體**:

class

solution

int merge

(int l,int r,int mid,vector

& nums)

else

if(j==r+1)

//右邊用完

else

if(nums[i]

<=nums[j]

)//前面的小

else

//後面的小

}for

(int k=l;k<=r;k++

)//返回排好序的子陣列

return sum;

} int reversepairs

(vector

& 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對於...