chenfy27的刷题记录

导航

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;
    }
};

posted on 2024-03-16 10:52  chenfy27  阅读(13)  评论(0)    收藏  举报