问题:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
输入:数组
输出:逆序对总数
思路:分治
先把数组分成子数组,统计出子数组内部的逆序对数目,然后再统计出两个相邻子数组之间的逆序对数目。还需要对数组进行排序。
基于归并排序写出以下代码:
class Solution {
public:
long long InversePairsCore(vector<int>& data,vector<int>& copy,int i,int j)
{
if(i==j)
{
copy[i]=data[i];
return 0;
}
int length=(j-i)/2;
int left=InversePairsCore(copy,data,i,i+length);
int right=InversePairsCore(copy,data,i+length+1,j);
// m is end of left
int m=i+length;
// n is end of right
int n=j;
int indexCopy=j;
long long count=0;
while(m>=i&&n>=i+length+1)
{
if(data[m]>data[n])
{
copy[indexCopy--]=data[m--];
count+=n-i-length;
}
else
{
copy[indexCopy--]=data[n--];
}
}
for(;m>=i;m--)
copy[indexCopy--]=data[m];
for(;n>=i+length+1;n--)
copy[indexCopy--]=data[n];
return (left+right+count)%1000000007;
}
int InversePairs(vector<int>& data) {
int len=data.size();
if(len==0)
return 0;
vector<int> copy(len);
for(int i=0;i<len;++i)
copy[i]=data[i];
long long count=InversePairsCore(data, copy, 0, len-1);
return count;
}
};
复杂度分析:时间复杂度为O(nlogn),空间复杂度为O(n).