Leetcode 327. 区间和的个数(困难)

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。

代码

class Solution {
public:
    int countRangeSum(vector<int>& nums, int lower, int upper) {
        int len=nums.size();
        vector<long long> sums(len+1,0);
        for(int i=0;i<len;i++){
            sums[i+1]=sums[i]+nums[i];
        }

        return countAndMergeSort(sums,0,len+1,lower,upper);        
    }
    int countAndMergeSort(vector<long long>& sums,int start,int end,int lower,int upper){
        if(end-start<=1)return 0;
        vector<long long> cache(end-start);
        int middle=(start+end)/2;

        int cnt=countAndMergeSort(sums,start,middle,lower,upper)+
            countAndMergeSort(sums,middle,end,lower,upper);
        int j=middle,k=middle,t=middle;
        int r=0;
        for(int i=start;i<middle;++i){
            while(j<end && sums[j]-sums[i]<lower)j++;
            while(k<end && sums[k]-sums[i]<=upper)k++;
            while(t<end && sums[t]<sums[i])cache[r++]=sums[t++];
            cache[r++]=sums[i];
            cnt+=k-j;
        }
        copy(cache.begin(),cache.begin()+r,sums.begin()+start);
        return cnt;
    }

};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值