先学习求普通的逆序对剑指 Offer 51. 数组中的逆序对
本题思路:如果左边的第i个是右边的第j个的2 倍之多,则i之后的||L||-i 都是满足要求的逆序对,则j++来判断i能否可以和j之后的成为满足要求的逆序对,否则来判断i之后的能否可以和j满足要求的逆序对,即i++
class Solution {
public:
int sort_and_count(vector<int>&A,int start,int end){
if(start<end) {
int mid=start+(end-start)/2;
int RC_L=sort_and_count(A,start,mid);
int RC_R=sort_and_count(A,mid+1,end);
int C=merge_and_count(A,start,mid,end);
return RC_L+RC_R+C;
}
return 0;
}
int merge_and_count(vector<int>& A,int start,int mid,int end){
// L= A[start:mid] R=A[mid+1,end]
// RC 表示逆序 reversed count 个数
int RC=0,i=start,j=mid+1,k=0;
// vector<int>res(end-start+1);
int res[end-start+1];
// 先合并
while(i<=mid&&j<=end){
if(A[i]>A[j])
res[k]=A[j++];
else
res[k]=A[i++];
k++;
}
while(i<=mid) res[k++]=A[i++];
while(j<=end) res[k++]=A[j++];
// 后统计
i=start,j=mid+1;
while(i<=mid&&j<=end){
if((long long )A[i]>2*(long long )A[j]){
j++;
RC+=mid-i+1;
}
else i++;
}
for( k=0;k<=end-start;k++) A[k+start]=res[k];
return RC;
}
int reversePairs(vector<int>& nums) {
return sort_and_count(nums,0,nums.size()-1);
}
};