在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007 。
class Solution {
public:
int InversePairs(vector<int> data) {
int n = data.size();
vector<int> copy(data);
return InversePairsCore(data,copy,0,n-1);
}
int InversePairsCore(vector<int> &data,vector<int> ©, int begin, int end)
{//合并data的两半段到辅助数组copy中有序
if(begin<=end)
{
return 0;
}
else
{
int mid=(end+begin)/2;
int left = InversePairsCore(copy,data,begin,mid);//使data的左半段有序
int right = InversePairsCore(copy,data,mid+1,end);//使data的右半段有序
int cnt=0;
int cpIndex=end;
int i=mid;
int j=end;
//合并两个有序段,到copy数组
while(i>=begin && j>= mid+1)
{
if(data[i]>data[j])//每次比较的是两个有序序列
{
cnt+=(j-mid);
copy[cpIndex--]=data[i--];
cnt%=1000000007;
}
else
{
copy[cpIndex--]=data[j--];
}
}
for(;i>=begin;--i)
copy[cpIndex--]=data[i];
for(;j>=mid+1;--j)
copy[cpIndex--]=data[j];
return (left+right+cnt)%1000000007;
}
}
};