leetcode 327. 区间和的个数

95 阅读1分钟

c++

class Solution {
public:
    int countPart(vector<long long>& sum, int l1, int r1, int l2, int r2, int lower, int upper) {
        int ans = 0, l = l1, r = l1;
        for (int j = l2; j <= r2; j++) {
            long long a = sum[j] - upper;
            long long b = sum[j] - lower;
            while (l <= r1 && sum[l] < a) l++;
            while (r <= r1 && sum[r] <= b) r++;
            ans += r - l;
        }
        return ans;
    }

    int mergeSort(vector<long long>& sum, int l, int r, int lower, int upper) {
        if (l >= r) return 0;
        int mid = (l + r) >> 1, ans = 0;
        ans += mergeSort(sum, l, mid, lower, upper);
        ans += mergeSort(sum, mid + 1, r, lower, upper);
        ans += countPart(sum, l, mid, mid + 1, r, lower, upper);
        int k = l, p1 = l, p2 = mid + 1;
        while (p1 <= mid || p2 <= r) {
            if (p2 > r || (p1 <= mid && sum[p1] <= sum[p2])) temp[k++] = sum[p1++];
            else temp[k++] = sum[p2++];
        }
        for (int i = l; i <= r; i++) sum[i] = temp[i];
        return ans;
    }

    vector<long long> temp;
    int countRangeSum(vector<int>& nums, int lower, int upper) {
        vector<long long> sum(nums.size() + 1, 0);
        for (int i = 0; i < nums.size(); i++) sum[i + 1] = sum[i] + nums[i];
        while (temp.size() < sum.size()) temp.push_back(0);
        return mergeSort(sum, 0, sum.size() -1, lower, upper);
    }
};

js

var countPart = function(sum, a1, b1, a2, b2, lower, upper) {
    var ans = 0, l = a1, r = a1;
    for (var j = a2; j <= b2; j++) {
        var a = sum[j] - upper, b = sum[j] - lower;
        while (l <= b1 && sum[l] < a) l++;
        while (r <= b1 && sum[r] <= b) r++;
        ans += r - l;
    }
    return ans;
}

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

var countRangeSum = function(nums, lower, upper) {
    var sum = new Array(nums.length + 1).fill(0), temp = new Array(nums.length + 1).fill(0);
    for (var i = 0; i < nums.length; i++) sum[i + 1] = sum[i] + nums[i];
    return mergeSort(sum, temp, 0, nums.length, lower, upper);
};