LC 面试题51 数组中的逆序对

Posted lihanwen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LC 面试题51 数组中的逆序对相关的知识,希望对你有一定的参考价值。

求解逆序对问题,首先基础方法就是归并排序,高阶方法可以用树状数组。
首先知道什么叫逆序对:对于一个序列(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;
    }
};

以上是关于LC 面试题51 数组中的逆序对的主要内容,如果未能解决你的问题,请参考以下文章

归并排序(归并排序求逆序对数)--16--归并排序--Leetcode面试题51.数组中的逆序对

[LeetCode] 面试题51. 数组中的逆序对

结合《剑指offer(第二版)》面试题51来谈谈归并排序

面试题36 数组中的逆序对

剑指Offer---面试题36:数组中的逆序对

剑指offer面试题36-数组中的逆序对