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