题目链接:https://www.acwing.com/problem/content/61/
题目如下:
class Solution {
public:
int inversePairs(vector<int>& nums) {
return merge(nums,0,nums.size()-1);
}
int merge(vector<int>& nums,int l,int r){//返回值是逆序对的个数
if(l>=r) return 0;
int mid=(l+r)>>1;
int res=merge(nums,l,mid)+merge(nums,mid+1,r);//逆序对个数=左边逆序对个数+右边逆序对个数
int i=l,j=mid+1;
vector<int> temp;
//将两个已经有序的数组合并为一个有序的数组
while(i<=mid&&j<=r){
if(nums[i]<=nums[j]) temp.push_back(nums[i++]);
else {
temp.push_back(nums[j++]);
res+=mid-i+1;//若区间a中位置i的数>区间b位置j的数,则i+1到mid的数都大于j当前的位置
}
}
while(i<=mid) temp.push_back(nums[i++]);
while(j<=r) temp.push_back(nums[j++]);
i=l;//将临时数组中的元素放回原来的数组中,完成归并
for(auto e:temp) nums[i++]=e;
return res;
}
};