方法 1:前缀和 + 哈希表
思路
- 设数组
nums
,其前缀和数组s
中某个元素的值为pre
,则理解这个题目的关键公式为pre - (pre - k) = k
。 - 如何理解?
- 设数组
nums
的前缀和数组为s
,则nums
任意区间[i, j]
的和可以通过s[j + 1] - s[i]
来计算。 - 若
s
中某个特定元素的值为pre
,那么要想nums
存在某个区间的和为k
,只需要在pre
之前存在一个元素的值为pre - k
即可,这样pre - (pre - k)
就会等于k
。若pre
之前存在多个pre - k
,那么答案的数量也会一并增加。 - 因此我们可以在遍历数组查看
pre
的过程中,把用一个哈希表将每个值和它出现的次数存起来。每遍历一个元素pre
,就查看一下之前是否存在pre - k
,如此往复,最终即可求出答案。
- 设数组
- 由于我们的所有前缀和只需要在哈希表中获取,因此可以使用单一变量,一边遍历数组,一边获取前缀和。
- 注意,只能先更新答案,再更新哈希表。因为若先更新哈希表,在
k = 0
的情况下,cnt[pre - k]
会和cnt[pre]
相等,从而得到错误的答案。例子:nums = [2], k = 0
。
代码
|
|
复杂度
- 时间复杂度:$O(n)$
- 空间复杂度:$O(m)$,哈希表的空间占用,即正常计算的前缀和数组中不同前缀和的数量。