剑指 Offer 51. 数组中的逆序对
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210317144156269.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM3NDU0ODUy,size_16,color_FFFFFF,t_70)
class Solution {
public:
int ans = 0;
void mergeSort(vector<int>& nums, int left, int right, vector<int>& temp) {
if(right - left <= 1) return ;
int mid = (left + right) / 2;
mergeSort(nums, left, mid, temp);
mergeSort(nums, mid, right, temp);
int ii = left, jj = mid, kk = left;
while(ii < mid && jj < right) {
if(nums[ii] <= nums[jj]) temp[kk++] = nums[ii++];
else {
temp[kk++] = nums[jj++];
ans += mid - ii;
}
}
while(ii < mid) temp[kk++] = nums[ii++];
while(jj < right) temp[kk++] = nums[jj++];
while(left < right) nums[left] = temp[left], left++;
}
int reversePairs(vector<int>& nums) {
if(nums.size() <= 1) return 0;
vector<int> temp(nums.size(), 0);
mergeSort(nums, 0, nums.size(), temp);
return ans;
}
};
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210317143740321.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM3NDU0ODUy,size_16,color_FFFFFF,t_70)
class Solution {
public:
int ans = 0;
void mergeSort(vector<int>& nums, int left, int right, vector<int>& temp) {
if(left >= right) return ;
int mid = (left + right) / 2;
mergeSort(nums, left, mid, temp);
mergeSort(nums, mid+1, right, temp);
int ii = left, jj = mid+1, kk = left;
while(ii <= mid && jj <= right) {
if(nums[ii] <= nums[jj]) temp[kk++] = nums[ii++];
else {
temp[kk++] = nums[jj++];
ans += mid - ii + 1;
}
}
while(ii <= mid) temp[kk++] = nums[ii++];
while(jj <= right) temp[kk++] = nums[jj++];
while(left <= right) nums[left] = temp[left], left++;
}
int reversePairs(vector<int>& nums) {
if(nums.size() <= 1) return 0;
vector<int> temp(nums.size(), 0);
mergeSort(nums, 0, nums.size()-1, temp);
return ans;
}
};