560.和为K的子数组
前缀和 + 哈希表
var subarraySum = function(nums, k) {
const mp = new Map();
mp.set(0, 1); // 0出现1次 key为前缀和,value为出现次数
let count = 0, pre = 0; // 解个数count,前缀和pre
// 和为k的子数组的个数 === 需要找到该数组中和为 k 的连续子数组的个数
for(const num of nums){
// 计算当前位置的前缀和(前缀和包括自身)
pre += num;
// 假如k = 3, 前面有前缀和:0 1 2,
// 如果当前pre(3) - k(3) = 0(若存在这个0),
// 则代表有解,pre = 0,有多少个0(也就是对应的value),count就加上多少
if(mp.has(pre - k)){
count += mp.get(pre - k);
}
if(mp.has(pre)){
// 如果map有pre这个key,那就给value+1
mp.set(pre, mp.get(pre) + 1);
}else{
// 如果没有pre这个key,则将pre对应的value(也就是pre的个数)设置为1
mp.set(pre, 1);
}
}
return count;
};