LeetCode 剑指Offer51 数组中的逆序对
题目链接:LeetCode 剑指Offer51 数组中的逆序对
题目大意:
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
题解:
归并排序过程中计数即可。
class Solution {
public:
int reversePairs(vector<int>& nums) {
int n = nums.size();
vector<int> tmp(n);
return mergeSort(nums, tmp, 0, n - 1);
}
int mergeSort(vector<int>& nums, vector<int>& tmp, int left, int right) {
if (left >= right) {
return 0;
}
int mid = left + right >> 1;
int cnt = mergeSort(nums, tmp, left, mid) + mergeSort(nums, tmp, mid + 1, right);
int i = left, j = mid + 1, pos = left;
while (i <= mid && j <= right) {
if (nums[i] <= nums[j]) {
tmp[pos++] = nums[i++];
cnt += (j - mid - 1);
} else {
tmp[pos++] = nums[j++];
}
}
while (i <= mid) {
tmp[pos++] = nums[i++];
cnt += (j - mid - 1);
}
while (j <= right) {
tmp[pos++] = nums[j++];
}
copy(tmp.begin() + left, tmp.begin() + right + 1, nums.begin() + left);
return cnt;
}
};