29. 和为 k 的子数组
题目链接:
题目描述:

题目示例:

解法(前缀和 + 哈希表):
算法思路:

设 i 为数组中的任意位置,用 sum[i] 表示 [0, i] 区间内所有元素的和。想知道有多少个以 i 结尾的和为 k 的子数组,就要找到有多少个起始位置为 x1, x2, x3...,使得 [x, i] 区间内所有元素的和为 k。那么 [0, x] 区间内的和就是 sum[i] - k。于是问题就变成:
- 找到在
[0, i-1]区间内,有多少前缀和等于sum[i] - k的即可。
我们其实也不用真的初始化一个前缀和数组,因为我们只关心在 i 位置之前,有多少个前缀和等于 sum[i] - k。因此,我们仅需要用一个哈希表,一边求当前位置的前缀和,一边存下之前每一种前缀和出现的次数。
C++ 算法代码:
class Solution {
public:
int {
unordered_map<, > hash;
hash[] = ;
sum = , ret = ;
( x : nums) {
sum += x;
(hash.(sum - k)) ret += hash[sum - k];
hash[sum]++;
}
ret;
}
};







