考点:归并排序与逆序对息息相关
考虑在归并排序的合并阶段统计「逆序对」数量,完成归并排序时,也随之完成所有逆序对的统计。
https://leetcode-cn.com/problems/shu-zu-zhong-de-ni-xu-dui-lcof/solution/jian-zhi-offer-51-shu-zu-zhong-de-ni-xu-pvn2h/
class Solution {
public:
int mergeSort(vector<int>& nums,vector<int>& tmp,int l,int r){
if(l>=r){
return 0;
}
int mid=(l+r)/2;
int inv_count=mergeSort(nums,tmp,l,mid)+mergeSort(nums,tmp,mid+1,r);//边归并边计算逆序对数目
int i=l,j=mid+1,pos=l;
while(i<=mid&&j<=r){
if(nums[i]<=nums[j]){
tmp[pos]=nums[i];
++i;
inv_count+=(j-(mid+1));
}else{
tmp[pos]=nums[j];
++j;
}
++pos;
}
for(int k=i;k<=mid;k++){
tmp[pos++] = nums[k];
inv_count += (j - (mid + 1));
}
for(int k=j;k<=r;k++){
tmp[pos++] = nums[k];
}
copy(tmp.begin() + l, tmp.begin() + r + 1, nums.begin() + l);
return inv_count;
}
int reversePairs(vector<int>& nums) {
int n = nums.size();
vector<int> tmp(n);
return mergeSort(nums, tmp, 0, n - 1);
}
};