327. 区间和的个数

给定一个整数数组 nums,返回区间和在 [lower, upper] 之间的个数,包含 lower 和 upper
区间和 S(i, j) 表示在 nums 中,位置从 i 到 j 的元素之和,包含 i 和 j (i ≤ j)。

说明:
最直观的算法复杂度是 O(n2) ,请在此基础上优化你的算法。

示例:

输入: nums = [-2,5,-1], lower = -2, upper = 2,
输出: 3 
解释: 3个区间分别是: [0,0], [2,2], [0,2],它们表示的和分别为: -2, -1, 2。


use merge sort
class Solution {
public:
    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];
        
        return merge(sum, 0, sum.size(), lower, upper);
    }
        
    int merge(vector<long long>& nums, int start, int end, int lower, int upper) {
        if (end - start <= 1) return 0;
            
        int middle = start + (end - start) / 2;
        int count = merge(nums, start, middle, lower, upper) + 
                    merge(nums, middle, end, lower, upper);
            
        int small = middle;
        int between = middle;
        for (int i = start; i < middle; ++i) {
            while (small < end && nums[small] - nums[i] < lower) 
                ++small;
            while (between < end && nums[between] - nums[i] <= upper)
                ++between;
        count += between - small;
        }
            
        inplace_merge(nums.begin() + start, nums.begin() + middle, nums.begin() + end);
        return count;
    }
};
原文地址:https://www.cnblogs.com/xxxsans/p/13939997.html