在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
示例 :
输入: [7,5,6,4]
输出: 5
- 限制:
0 <= 数组长度 <= 50000
思路:直接暴力求解会超时。可以用归并排序做,在归并排序合并时做一个判断,设合并时左边的数组从start1开始,右边从start2开始;当nums[start1] > nums[start2]时,nums[start1] ~ nums[mid]都大于 nums[start2],可以组成的逆序对的数量为mid - start1 + 1。
int merge_sort(vector<int> &nums, vector<int> &tmp, int start, int end) {
if (start >= end)
return 0 ;
int mid = (start + end) / 2;
int start1 = start, start2 = mid + 1;
int res = merge_sort(nums, tmp, start1, mid) + merge_sort(nums, tmp, start2, end);
int k = start;
while (start1 <= mid && start2 <= end) {
if (nums[start1] <= nums[start2]) {
tmp[k++] = nums[start1++];
} else {
res += (mid - start1 + 1);
tmp[k++] = nums[start2++];
}
}
while (start1 <= mid) {
tmp[k++] = nums[start1++];
}
while (start2 <= end) {
tmp[k++] = nums[start2++];
}
for (k = start; k <= end; k++) {
nums[k] = tmp[k];
}
return res;
}
int reversePairs(vector<int>& nums) {
vector<int> tmp(nums.size());
return merge_sort(nums, tmp, 0, nums.size() - 1);
}