leetcode 315. 计算右侧小于当前元素的个数

120 阅读1分钟

c++

class Solution {
public:
    struct Data {
        Data(int val, int ind) : val(val), ind(ind), cnt(0) {}
        bool operator>(Data a) {
            return val > a.val;
        }
        int val, ind, cnt;
    };

    void mergeSort(vector<Data> &arr, vector<Data> &tmp, int l, int r) {
        if (l >= r) return ;
        int mid = (l + r) >> 1;
        mergeSort(arr, tmp, l, mid);
        mergeSort(arr, tmp, mid + 1, r);
        int k = l, p1 = l, p2 = mid + 1;
        while (p1 <= mid || p2 <= r) {
            if (p2 > r || (p1 <= mid && arr[p1] > arr[p2])) {
                arr[p1].cnt += r - p2 + 1;
                tmp[k++] = arr[p1++];
            } else {
                tmp[k++] = arr[p2++];
            }
        }
        for (int i = l; i <= r; i++) arr[i] = tmp[i];
        return ;
    }

    vector<int> countSmaller(vector<int>& nums) {
        vector<Data> arr;
        vector<Data> tmp;
        for (int i = 0; i < nums.size(); i++) arr.push_back(Data{nums[i], i}), tmp.push_back(Data{0, 0});
        mergeSort(arr, tmp, 0, arr.size() - 1);
        vector<int> ans(arr.size(), 0);
        for (auto x : arr) ans[x.ind] = x.cnt;
        return ans;
    }
};

js

function mergeSort(arr, tmp, l, r) {
    if (l >= r) return ;
    var mid = Math.floor((l + r) / 2);
    mergeSort(arr, tmp, l, mid);
    mergeSort(arr, tmp, mid + 1, r);
    var k = l, p1 = l, p2 = mid + 1;
    while (p1 <= mid || p2 <= r) {
        if (p2 > r || (p1 <= mid && arr[p1].val > arr[p2].val)) {
            arr[p1].cnt += r - p2 + 1;
            tmp[k++] = arr[p1++]
        } else tmp[k++] = arr[p2++];
    }
    for (var i = l; i <= r; i++) arr[i] = tmp[i];
    return ;
}

var countSmaller = function(nums) {
    var arr = [], tmp = [], ans = [];
    for (var i = 0; i < nums.length; i++) arr.push({val : nums[i], ind : i, cnt : 0});
    mergeSort(arr, tmp, 0, arr.length - 1);
    for (var x of arr) ans[x.ind] = x.cnt;
    return ans;
};