题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
思路:运用归并排序的思想。
class Solution {
public:
long long InversePairsCore(vector<int> &a,int l, int mid, int h)
{
vector<int> temp(h-l+1);
long long i=mid,j=h,k=h-l,count=0;
while(i>=l&&j>=mid+1)
{
if(a[i]>a[j])
{
count+=(j-mid);
temp[k--]=a[i];
i--;
}
else
{
temp[k--]=a[j];
j--;
}
}
while(i>=l)
{
temp[k--]=a[i--];
}
while(j>=mid+1)
{
temp[k--]=a[j--];
}
for(int i=l;i<=h;i++)
{
a[i]=temp[i-l];
}
return count;
}
long long InversePairs1(vector<int> &data,int l, int h) {
if(l<h)
{
int mid = l+(h-l)/2;
long long left = InversePairs1(data,l,mid);//求左边数组内部的逆序数
long long right = InversePairs1(data,mid+1,h);//求右边数组内部的逆序数
long long count = InversePairsCore(data,l,mid,h);//求左右两边数组之间的逆序数
return left+right+count;
}
else
return 0;
}
int InversePairs(vector<int> &data) {
return InversePairs1(data,0,data.size()-1)%1000000007;
}
};