剑指 Offer 51. 数组中的逆序对

题目介绍

在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。

示例 1:

输入: [7,5,6,4]
输出: 5

限制:

0 <= 数组长度 <= 50000

解答

class Solution {
public:
    int reversePairs(vector<int>& nums) {
        vector<int> tmp(nums.size());
        return mergeSort(0, nums.size() - 1, nums, tmp);
    }

private:
    int mergeSort(int l, int r, vector<int> &nums, vector<int> &tmp)
    {
        // 终止条件
        if(l >= r) return 0;
        
        // 递归划分
        int m = (l + r) / 2;
        int res = mergeSort(l, m, nums, tmp) + mergeSort(m + 1, r, nums, tmp);

        // 合并阶段
        int i = l, j = m + 1;
        for(int k = l; k <= r; k++) // nums元素转存到tmp中
            tmp[k] = nums[k];

        for(int k = l; k <= r; k++)
        {
            if(i == m + 1) // 左边数字已经全部放入 nums 数组
            {
                nums[k] = tmp[j++];
            }
            else if(j == r + 1 || tmp[i] <= tmp[j]) // 右边的数字全部放入了nums数组 或左边数字小于右边(顺序)
            {
                nums[k] = tmp[i++];
            }
            else //右边j指向的数字更小,说明和左边i指向元素及右边的所有数字构成逆序对
            {
                nums[k] = tmp[j++];
                res += m - i + 1;
            }
        }
        return res;
    }
};

你可能感兴趣的:(LeetCode错题集,算法,数据结构,c++)