leetcode327 区间和的个数
给定数组nums[n]和整数lower与upper,求nums[n]中,元素之和在[lower,upper]范围内的子数组个数。
1<=n<=1e5; nums[i]在int范围内; -1e5<=lower<=upper<=1e5; 答案在int范围内
分析:子数组的和可以用前缀和来快速求出,假设当前位置对应的前缀和为y,前面某处对应的前缀和为x,满足lower<=y-x<=upper,变形得y-upper<=x<=y-lower,需要找满足该条件的x的个数,套平衡树模板即可。
// Treap模板...
class Solution {
public:
int countRangeSum(vector<int>& nums, int lower, int upper) {
int n = nums.size();
vector<long long> pre(n);
for (int i = 0; i < n; i++)
pre[i] = nums[i];
partial_sum(pre.begin(), pre.end(), pre.begin());
Treap<long long> tp;
tp.insert(0);
int ans = 0;
for (auto i : pre) {
ans += tp.size() - tp.ltcnt(i - upper) - tp.gtcnt(i - lower);
tp.insert(i);
}
return ans;
}
};
浙公网安备 33010602011771号