劍指offer 51 陣列中的逆序對

2021-10-08 16:54:08 字數 930 閱讀 8548

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

示例 1:

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

輸出: 5

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

變種是 求每個位置往後的逆序數的數量,大致思路一致(詳見之前的題解,求陣列右邊小於當前元素的數量)

思路:

歸併排序,歸併排序的過程之中,如果右邊的有序子陣列需要插入到左邊子陣列中的時候,就說明,當前插入的元素一定小於目前還沒有被插入的左邊陣列中的元素,這就構成了乙個個逆序對,計算此時還沒有插入的左邊陣列的數量即可。

注:這個實現時間和空間複雜度都很爛。

class

solution

void

mergesort

(vector<

int>

&nums)

if(mid*

2!=len)b.

push_back

(nums[len-1]

);mergesort

(a);

mergesort

(b);

mergetwosortedarray

(a,b,nums);}

void

mergetwosortedarray

(vector<

int>

&a,vector<

int>

&b,vector<

int>

&nums)

else

}while

(iwhile

(jreturn;}

};

劍指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對於...