问题描述
简要思路
使用归并排序的分治思想。
res = merge_sort(nums, l, mid) + merge_sort(nums, mid+1, r) 计算分开后每一部分的逆序对。
res += mid-i+1; 计算两部分之间的逆序对。
ps. 思路来源:y总AcWing归并排序模板题。
代码
class Solution {
public:
int temp[50010];
long long merge_sort(vector<int> &nums, int l, int r){
if(l >= r) return 0;
int mid = (l+r)/2;
long long res = merge_sort(nums, l, mid) + merge_sort(nums, mid+1, r);
int k = 0, i = l, j = mid+1;
while(i <= mid && j <= r){
if(nums[i] <= nums[j]) temp[k++] = nums[i++];
else{
temp[k++] = nums[j++];
res += mid-i+1;
}
}
while(i <= mid) temp[k++] = nums[i++];
while(j <= r) temp[k++] = nums[j++];
for(i=l, j=0; i <= r; i++,j++) nums[i] = temp[j];
return res;
}
int reversePairs(vector<int>& nums) {
int n = nums.size();
return merge_sort(nums, 0, n-1);
}
};