题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
分析
1.如果对每一个数字,依此查找它前面的所有数字,复杂度为O(n2);
2.结合归并排序的思想,复杂度为O(nlogn).
3.用long long防止溢出
代码
class Solution {
public:
int InversePairs(vector<int> data) {
if(data.size()<2) return 0;
vector<int> copy(data);
long long count=InversePairsCore(data,copy,0,copy.size()-1);
return count%1000000007;
}
int InversePairsCore(vector<int>& data,vector<int>& copy,int first,int last)
{
if(first==last) {
//copy[first]=data[first];
return 0;
}
int length=(last-first)/2;
long long left=InversePairsCore(copy,data,first,first+length)%1000000007;
long long right=InversePairsCore(copy,data,first+length+1,last)%1000000007;
int i=first+length;
int j=last;
int indexCopy=last;
long long count=0;
while(i>=first&&j>=first+length+1){
if(data[i]>data[j]){
copy[indexCopy--]=data[i--];
count=count+(j-first-length);
} else{
copy[indexCopy--]=data[j--];
}
}
for(;i>=first;--i)
copy[indexCopy--]=data[i];
for(;j>=first+length+1;--j)
copy[indexCopy--]=data[j];
return (left+right+count)%1000000007;
}
};