/*
 * @lc app=leetcode.cn id=560 lang=javascript
 *
 * [560] 和为 K 的子数组
 */

// @lc code=start
/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number}
 */
var subarraySum = function (nums, k) {
  let ans = 0, pre = 0;
  const map = new Map();

  // 为了匹配 k 和 pre 相等的情况,比如: pre = 7, k = 7
  // 那说明 pre 是从索引 0 开始到当前索引的累加和,是符合条件的
  // 所以需要在 hash 表中增加 0,不然会漏掉这种情况
  map.set(0, 1);

  for (let num of nums) {
    pre += num;
    ans += map.get(pre - k) ?? 0;
    map.set(pre, (map.get(pre) ?? 0) + 1);
  }

  return ans;
};
// @lc code=end

console.log(subarraySum([1, 1, 1], 2))
console.log(subarraySum([1, 2, 3], 3))