我的力扣算法327-区间和的个数

ok
我来了
我唯唯诺诺
我,啪的一下就蒙蔽了,很快啊
看题:
在这里插入图片描述
其实题目的意思很简单,就是说它会给你三个参数,一个是一个数组,还有由其他两个参数构成的范围。
你的目的就是计算,在数组中找到一个区间,这个区间的和要在这个范围里面,就比如说数组{1,2}
我给的范围是【1,1】,那么就该输出有1种区间,也就是[1,1]这个区间。
这题可以用暴力的方式解出来,这也是我很快就想到的一种方式:

class Solution {
public:
    int countRangeSum(vector<int>& nums, int lower, int upper) {
        int count=0;//计数器,计算有多少个满足范围的区间和
        for(int i=0;i<nums.size();i++){//遍历
            long long sum=0;//用于计算区间和
            for(int j=i;j<nums.size();j++){//遍历数组
                sum+=nums[j];//计算区间和
                if(sum<=upper&&sum>=lower){//比较是否满足条件
                    count++;
                }
            }
        }
        return count;
    }
};

但由于该算法的时间复杂度为O(n2),所以时间限制会超时,所以我没了。
下面是一种比较简洁的方式:

class Solution {
public:
    int countRangeSum(vector<int>& nums, int lower, int upper) {
        
        int n= nums.size();
        int64_t presum = 0;
        multiset<int64_t> S;
        S.insert(0);
        int ret = 0;
        for(int i=0;i<n;i++){
            presum += nums[i];
            ret += distance(S.lower_bound(presum-upper),S.upper_bound(presum-lower));
            S.insert(presum);
        }
        return ret;
    }        
};

这是大神的,利用了前缀和和平衡树,说来惭愧,我也不是很了解这方面,我会仔细学习一下,明天开一个前缀和的分享,谢谢支持。
加了个油!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值