题目:
给定一个整数数组 nums,返回区间和在 [lower, upper] 之间的个数,包含 lower 和 upper。
区间和 S(i, j) 表示在 nums 中,位置从 i 到 j 的元素之和,包含 i 和 j (i ≤ j)。
说明:
最直观的算法复杂度是 O(n2) ,请在此基础上优化你的算法。
示例:
输入: nums = [-2,5,-1], lower = -2, upper = 2,
输出: 3
解释: 3个区间分别是: [0,0], [2,2], [0,2],它们表示的和分别为: -2, -1, 2。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/count-of-range-sum
方法一:
利用哈希表:在遍历的过程中,在每个位置i处,将[0, i]的和sum[i]存入哈希表中,在 i+1 处有何sum[i+1],在哈希表中寻找满足的target = sum[i+1]-j (lower<=j<=upper)。
class Solution:
def countRangeSum(self, nums: List[int], lower: int, upper: int) -> int:
l = len(nums)
cnt = 0
S = 0
val = {}
val[S]=1
for i in range(l):
S += nums[i]
for j in range(lower, upper+1):
target = S - j
if target in val:
cnt += val[target]
if S in val:
val[S]+=1
else:
val[S] = 1
return cnt