标签:off coder com 等于 有一个 位置 结果 data 第一个
https://www.nowcoder.com/questionTerminal/96bd6684e04a44eb80e6a68efc0ec6c5
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007。题目保证输入的数组中没有的相同的数字。
在归并排序的过程中计逆序对。时间复杂度O(nlogn),空间复杂度O(n)。
while(i>=l)
,使得程序错误。cnt+=(j-mid)%1000000007
应改为cnt=(cnt+(j-mid))%1000000007
class Solution {
public:
int InversePairs(vector<int> data) {
int cnt=0;
if(!data.empty()){
vector<int> copy;
for(auto it=data.begin();it!=data.end();++it){
copy.push_back(*it);
}
cnt=inversePairCnt(data,copy,0,data.size()-1);
}
return cnt;
}
private:
int inversePairCnt(vector<int>& data,vector<int>& copy,int l,int r){
if(l==r){
return 0;
}
int mid=(l+r)>>1;
int leftCnt=inversePairCnt(copy,data,l,mid);
int rightCnt=inversePairCnt(copy,data,mid+1,r);
int i=mid;
int j=r;
int copyIndex=r;
int cnt=0;
while(i>=l&&j>mid){
if(data[j]>data[i]){
copy[copyIndex--]=data[j--];
}
else{
cnt=(cnt+(j-mid))%1000000007;//
copy[copyIndex--]=data[i--];
}
}
while(i>=l){//
copy[copyIndex--]=data[i--];
}
while(j>mid){
copy[copyIndex--]=data[j--];
}
return (leftCnt+rightCnt+cnt)%1000000007;
}
};
标签:off coder com 等于 有一个 位置 结果 data 第一个
原文地址:https://www.cnblogs.com/coding-gaga/p/10545067.html