方法 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)$,哈希表的空间占用,即正常计算的前缀和数组中不同前缀和的数量。