0327:区间和的个数(★★)
目录
题目
给你一个整数数组 nums 以及两个整数 lower 和 upper 。求数组中,值位于范围 [lower, upper] (包含 lower 和 upper)之内的 区间和的个数 。
区间和 S(i, j) 表示在 nums 中,位置从 i 到 j 的元素之和,包含 i 和 j (i ≤ j)。
示例 1:
输入:nums = [-2,5,-1], lower = -2, upper = 2 输出:3 解释:存在三个区间:[0,0]、[2,2] 和 [0,2] ,对应的区间和分别是:-2 、-1 、2 。
示例 2:
输入:nums = [0], lower = 0, upper = 0 输出:1
提示:
1 <= nums.length <= 105-231 <= nums[i] <= 231 - 1-105 <= lower <= upper <= 105- 题目数据保证答案是一个 32 位 的整数
相似问题:
分析
- 区间和容易想到前缀和,先得到前缀和数组 P
- 遍历 j,在 P[:j] 中找 [P[j]-upper,P[j]-lower] 范围内的个数即可
- 可以维护有序集合,二分即可
解答
|
|
833 ms
*附加
还可以用 cdq 分治,分成排好序的两部分,计算前半部分对后半部分的贡献。
|
|
1067 ms