和为K的子数组

要求和为k的连续子数组

思路大概是 遍历的时候维护前缀和,通过hash表记录这些和,每次用当前前缀和 - k 看是否有满足的点,若有则是满足条件的子数组,哈希映射的值应该是该和 出现的次数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
int subarraySum(vector<int>& nums, int k) {
int pre = 0, res = 0;
unordered_map<int, int> ump;
ump[0] = 1; // 和为0时的子数组为1

for (int i = 0; i < nums.size(); ++ i) {
pre += nums[i];
if (ump.count(pre - k)) {
res += ump[pre - k];
}
ump[pre]++; // 累加当前和的数量
}
return res;
}