劍指51 陣列中的逆序對 遞迴方式的歸併排序

2021-08-19 18:38:06 字數 2333 閱讀 1195

在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數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

思路:

使用歸併排序+遞迴方式,需要注意的是,遞迴時需要對原空間和輔助空間進行輪換,每次傳參的第二項都是輔助空間,用於記錄最新排序結果,而遞迴回到上一層時,需要根據最新的區域性排序結果來更新整體排序結果。

以**為例,data是原空間而copy是輔助空間,第一次呼叫左右進入遞迴時,將copy作為原空間/data作為輔助空間,而當這一次遞迴結束時,data中的內容已經是最新的排序結果,在當前層可以被用於對比來寫最新的排序結果copy,即data永遠是次新的排序結果,copy是需要被重寫和最新的。

總而言之,保證每次在合併時,用於對比的陣列都是上一次遞迴完成後最新的排序結果

正確方法:

class solution 

int inversepairs_merge(vector&data,vector©,int start,int end)

int len = (end - start)>>2;

int left = inversepairs_merge(copy,data,start,start+len); //copy和data換位

int right = inversepairs_merge(copy,data,start+len+1,end); //copy和data換位

int i = start+len;

int j = end;

int copyindex = end;

int count = 0;

while(i>=start && j>=start+len+1)

else

copy[copyindex--] = data[j--];

}while(i>=start)

copy[copyindex--] = data[i--];

while(j>=start+len+1)

copy[copyindex--] = data[j--];

return (left+right+count)%1000000007;

}};

根據劍指offer面試題51 寫出乙個遞迴的歸併排序如下:

#include#include#includevoid merge(int* a,int* b,int start,int mid,int end)

while(i<=mid)

b[index++]=a[i++];

while(j<=end)

b[index++]=b[j++];

}void merge_sort(int* a,int* b,int start,int end)

int len = (end-start)/2;

int left = inversepairs_merge(data,list,start,start+len);

int right = inversepairs_merge(data,list,start+len+1,end);

int i=start+len;

int j=end;

int copyindex = end;

int count = 0;

while(i>=start && j>=start+len+1)

else

list[copyindex--]=data[j--];

}while(i>=start)

list[copyindex--]=data[i--];

while(j>=start+len+1)

list[copyindex--]=data[j--];

return count+left+right;

}int inversepairs(vectordata)

int count = inversepairs_merge(data,list,0,len-1);

delete list;

return count;

}};

劍指51 陣列中的逆序對

在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。即輸出p 1000000007。示例 輸入 1,2,3,4,5,6,7,0 輸出 7 逆序對的存在表明數字沒有按照順序排列,因此進...

劍指筆記 51 陣列中的逆序對

題目 在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p 思路 以下是劍指中的思路。最容易想到是就是順序掃瞄整個陣列,每掃瞄到乙個數字,逐個比較這個數字和它後面數字的大小。這種思路的時間複雜度是 歸併排序的時間複雜度是o nl...

劍指Offer 51 陣列中的逆序對

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