LeetCode 剑指Offer51 数组中的逆序对

题目链接:LeetCode 剑指Offer51 数组中的逆序对

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

题解:
归并排序过程中计数即可。

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

    int mergeSort(vector<int>& nums, vector<int>& tmp, int left, int right) {
        if (left >= right) {
            return 0;
        }
        int mid = left + right >> 1;
        int cnt = mergeSort(nums, tmp, left, mid) + mergeSort(nums, tmp, mid + 1, right);
        int i = left, j = mid + 1, pos = left;
        while (i <= mid && j <= right) {
            if (nums[i] <= nums[j]) {
                tmp[pos++] = nums[i++];
                cnt += (j - mid - 1);
            } else {
                tmp[pos++] = nums[j++];
            }
        }
        while (i <= mid) {
            tmp[pos++] = nums[i++];
            cnt += (j - mid - 1);
        }
        while (j <= right) {
            tmp[pos++] = nums[j++];
        }
        copy(tmp.begin() + left, tmp.begin() + right + 1, nums.begin() + left);
        return cnt;
    }
};
posted @ 2022-02-08 20:07  ZZHHOOUU  阅读(42)  评论(0编辑  收藏  举报