--- title: '560. Subarray Sum Equals K' description: Given an array of integers nums and an integer k, return the total number of subarrays whose sum equals to k sidebar: label: 'Subarray Sum Equals K' badge: 'Medium' --- Prefix Sum ### Example 1: - Input: `nums = [1,1,1], k = 2` - Output: `2` ### Example 2: - Input: `nums = [1,2,3], k = 3` - Output: `2` ### Constraints: - `1 <= nums.length <= 2 * 10^4` - `-1000 <= nums[i] <= 1000` - `-10^7 <= k <= 10^7` ## Approach ```mermaid flowchart TD S(["subarraySum(nums, k)"]) --> I["map = {0: 1} — the empty prefix; sum = 0, count = 0"] I --> L{"more n in nums?"} L -- no --> E(["return count"]) L -- yes --> A["sum += n"] A --> Q{"map has sum - k?"} Q -- yes --> C["count += map.get(sum - k) — every earlier prefix that closes a window"] Q -- no --> W["map.set(sum, count of sum + 1)"] C --> W W --> L ``` ## Solution ```js /** * @param {number[]} nums * @param {number} k * @return {number} */ var subarraySum = function(nums, k) { const map = new Map(); map.set(0, 1); let sum = 0; let count = 0; for (let n of nums){ sum += n; if(map.has(sum - k)){ count += map.get(sum - k); } map.set(sum, (map.get(sum) || 0) + 1); } return count }; ``` ## Explanation