时间限制:2秒 空间限制:32768K
题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007。
输入描述:
题目保证输入的数组中没有的相同的数字。
数据范围:
对于%50的数据,size<=10^4
对于%75的数据,size<=10^5
对于%100的数据,size<=2*10^5
输入
1,2,3,4,5,6,7,0
输出
7
我的代码
class Solution {
public:
int InversePairs(vector<int> data) {
if(data.size()<2)
return 0;
vector<int> data_copy(data.size(),0);//辅助数组
return InversePairsCore(data,data_copy,0,data.size()-1);
}
//归并思想
int InversePairsCore(vector<int> &arr,vector<int> &arr_,
int begin, int end){
if(begin==end){
arr_[begin]=arr[begin];
return 0;
}
int len=(end-begin)/2;
int left=InversePairsCore(arr,arr_,begin,begin+len);
int right=InversePairsCore(arr,arr_,begin+len+1,end);
int i=begin+len,j=end,k=end;
int count=0;
while((i>=begin)&&(j>begin+len)){
if(arr[i]>arr[j]){
arr_[k--]=arr[i--];
count+=j-begin-len;
if(count>1000000007)
count%=1000000007;
}
else
arr_[k--]=arr[j--];
}
while(i>=begin)
arr_[k--]=arr[i--];
while(j>begin+len)
arr_[k--]=arr[j--];
for(int i=begin;i<=end;i++)
arr[i]=arr_[i];
return (left+right+count)%1000000007;
}
};
运行时间:107ms
占用内存:4444k