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