标签:int 数组中的逆序对 并且 pre 就是 back ++ 序列 一个
求解逆序对问题,首先基础方法就是归并排序,高阶方法可以用树状数组。
首先知道什么叫逆序对:对于一个序列\(a\),如果\(i<j\)并且\(a[i]>a[j]\),则\(a[i]\)和\(a[j]\)构成逆序对。归并排序在合并的时候可以将求解逆序对作为子问题来求解,如果\(a[p1]<a[p2]\),则直接将小的值加入到排序数组中,如果\(a[p1]>a[p2]\),那\(p1-mid\)的所有的值都比\(a[p2]\)要大,会构成逆序对,可以顺便统计到答案中。
代码如下:
int merge_sort(vector<int> &nums, int l, int r) {
int ans = 0;
if (r <= l) return 0;
int mid = (l + r) >> 1;
ans += merge_sort(nums, l, mid) + merge_sort(nums, mid + 1, r);
vector<int> temp;
int p1 = l, p2 = mid + 1, k = 0;
while (p1 <= mid || p2 <= r) {
if (p2 > r || (p1 <= mid && nums[p1] <= nums[p2])) temp.push_back(nums[p1]), p1++;
else temp.push_back(nums[p2]), p2++, ans += mid - p1 + 1;
}
copy(temp.begin(), temp.end(), nums.begin() + l);
return ans;
}
class Solution {
public:
int reversePairs(vector<int>& nums) {
vector<int> temp;
int ans = merge_sort(nums, 0, nums.size() - 1);
return ans;
}
};
标签:int 数组中的逆序对 并且 pre 就是 back ++ 序列 一个
原文地址:https://www.cnblogs.com/lihanwen/p/12824459.html