題目描述
輸入描述:
題目保證輸入的數組中沒有的相同的數字
數據範圍:
對於%50的數據,size<=10^4
對於%75的數據,size<=10^5
對於%100的數據,size<=2*10^5
輸入例子:
1,2,3,4,5,6,7,0
輸出例子:
7
分析
假如寫出歸併排序的過程後,該方法只需要在歸併排序中添加記錄總數的一句話就行。
代碼實現
int InversePairs(vector<int> a) {
long long total_pairs = 0;
vector<int> temp(a);
mergeSort( a, temp, 0, a.size()-1 , total_pairs);
return total_pairs%1000000007 ;
}
void merge(vector<int>&a,vector<int>&temp, int start,int mid,int end ,long long & total_pairs){
int i = start;
int j = mid+1; ///參照兩個數的情況,j不能取mid
int ind = start;
while(i<=mid && j<=end){
if(a[i] <= a[j] ){
temp[ind++]= a[j++];
}
else{
temp[ind++]= a[i++];
total_pairs+= (end-j+1);
}
}
for(int k = i;k<=mid ;k++){
temp[ind++]= a[k];
}
for(int k = j;k<=end;k++)
temp[ind++]= a[k];
for(int k =start;k<=end;k++){
a[k]=temp[k];
}
}
void mergeSort(vector<int>&a,vector<int>&temp,int start,int end ,long long & total_pairs){
int n = a.size();
if(n<=0)
return ;
if(start<end){
int mid = (start + end)/2;
mergeSort( a, temp, start, mid ,total_pairs);
mergeSort( a, temp, mid+1, end ,total_pairs);
merge( a, temp, start, mid, end ,total_pairs);
}
}