leetcode-560.和为K的子数组

77 阅读1分钟

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;
};