LeetCode sword refers to Offer 51. Reversed pairs in the array
Problem Description
Brief idea
Use the divide and conquer idea of merge sort.
res = merge_sort(nums, l, mid) + merge_sort(nums, mid+1, r) calculates the reverse order pair of each part after splitting.
res += mid-i+1; Computes the reverse order pair between two parts.
ps. Idea source: y total AcWing merge sort template question.
the code
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);
}
};