题目链接:https://leetcode-cn.com/problems/shu-zu-zhong-de-ni-xu-dui-lcof/
题目如下:
class Solution {
public:
int reversePairs(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;//计算左右两个区间a,b之间的逆序对
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的数,则区间a位置i+1~mid位置的数都>区间b当前的位置
}
}
while(i<=mid) temp.push_back(nums[i++]);
while(j<=r) temp.push_back(nums[j++]);
i=l;//把临时数组中的元素放回去,即完成归并,归到原处
for(auto x:temp) nums[i++]=x;
return res;
}
};