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

94 阅读1分钟

c++

class Solution {
public:
    int countReversePairs(vector<int>& nums, vector<int>& arr, int l, int r) {
        if (l >= r) return 0;
        int ans = 0, mid = (r + l) >> 1;
        ans += countReversePairs(nums, arr, l, mid);
        ans += countReversePairs(nums, arr, mid + 1, r);
        int k = l, p1 = l, p2 = mid + 1;
        while (p1 <= mid || p2 <= r) {
            if (p2 > r || (p1 <= mid && nums[p1] <= nums[p2])) {
                arr[k++] = nums[p1++];
            } else {
                arr[k++] = nums[p2++];
                ans += (mid - p1 + 1); 
            }
        }
        for (int i = l; i <= r; i++) nums[i] = arr[i];
        return ans;
    }

    int reversePairs(vector<int>& nums) {
        vector<int> arr(nums.size(), 0);
        return countReversePairs(nums, arr, 0, nums.size() - 1);
    }
};

js

var countReversePairs = function(nums, temp, l, r) {
    if (l >= r) return 0;
    var ans = 0, mid = (l + r) >> 1;
    ans += countReversePairs(nums, temp, l, mid);
    ans += countReversePairs(nums, temp, mid + 1, r);
    var k = l, p1 = l, p2 = mid + 1;
    while (p1 <= mid || p2 <= r) {
        if (p2 > r || (p1 <= mid && nums[p1] <= nums[p2])) {
            temp[k++] = nums[p1++];
        } else {
            temp[k++] = nums[p2++];
            ans += (mid - p1 + 1);
        }
    }
    for (var i = l; i <= r; i++) nums[i] = temp[i];
    return ans;
}

var reversePairs = function(nums) {
    var temp = new Array(nums.length).fill(0);
    return countReversePairs(nums, temp, 0, nums.length - 1);
};