难度困难364
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
示例 1:
输入: [7,5,6,4] 输出: 5
限制:
0 <= 数组长度 <= 50000
通过归并排序,在排序过程中记录逆序对的数量。
class Solution {
public:
int res = 0;
vector<int>Des; // 中间数组
void merge(vector<int>& nums, int l, int mid, int r) {
int i = l, j = mid;
int k = l;
while (i != mid && j != r) {
if (nums[i] <= nums[j]) {
Des[k++] = nums[i++];
}
else {
Des[k++] = nums[j++];
res += mid - i;
}
}
while (i != mid) Des[k++] = nums[i++];
while (j != mid) Des[k++] = nums[j++];
for (i = l; i < r; ++i) {
nums[i] = Des[i];
}
}
void mergesort(vector<int>& nums, int l, int r) {
if (l < r) {
int mid = (l + r) >> 1;
mergesort(nums, l, mid);
mergesort(nums, mid, r);
merge(nums, l, mid, r);
}
}
int reversePairs(vector<int>& nums) {
Des.resize(nums.size());
mergesort(nums, 0, nums.size());
return res;
}
};