给你一个整数数组 nums
和一个整数 k
,请你统计并返回该数组中和为 k
的子数组的个数。子数组是数组中的一个连续序列。
想都没想,直接用了双指针,也是直接WA,然后才发现有负数数据。
思考了一下,这个题目实际上就是需要求解 sum(i, j) = k (i < j)
的个数,那么可以变成前缀和的问题。实际上,sum(i, j) = sum(0, j) - sum(0, i)
,那么只需要求解 sum(0, i) = sum(0, j) - k
的个数即可。
那么在实际实现的过程中,可以使用一个哈希表来存储前缀和的个数,然后遍历数组,对于每一个元素,计算当前的前缀和,然后查找哈希表中是否存在 sum(0, i) - k
的前缀和,如果存在,那么就说明存在一个子数组的和为 k
。
1 | class Solution: |
这里有一些可以注意的地方,例如代码 ans += hash_prefix.get(prefix[i]-k, 0)
和 hash_prefix[prefix[i]] = hash_prefix.get(prefix[i], 0) + 1
,前后不能够交换,举个简单的例子比如 nums = [2], k = 0
,那么实际上答案是 0
,但是如果交换了顺序,那么答案就会变成 1
。