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