劍指 Offer 51 陣列中的逆序對

2021-10-18 23:02:40 字數 1415 閱讀 3276

不能用暴力解法!

歸併排序

在分的過程中將陣列拆分到只有乙個元素,在治的過程中排序再合併,並且統計逆序對的數量。

與歸併排序唯一的區別就是加了逆序對的計算,那麼怎麼計算逆序對呢?

當右邊的a小於左邊的b時,那麼a會小於b右邊到右邊界所有的數,這些數的數量為mid-b的下標+1

將每一次歸併時這些數量統計起來即為結果

class

solution

int[

] copy =

newint

[nums.length]

;//不改變原陣列,複製乙份

for(

int i =

0; i < nums.length; i++

)int

temp =

newint

[nums.length]

;//用來存每一輪還沒合併前的值,用來比較

return

reversepairs

(copy,

0, nums.length -

1,temp);}

public

intreversepairs

(int

nums,

int left,

int right,

int[

] temp)

public

intmergeandcount

(int

nums,

int left,

int right,

int mid,

int[

] temp)

int i = left;

//左邊第乙個數

int j = mid +1;

//右邊第乙個數

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