--- 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 icon: dot topics: - { name: "Array", slug: "array" } - { name: "Hash Table", slug: "hash-table" } - { name: "Prefix Sum", slug: "prefix-sum" } video: "fFVZt-6sgyo" issue: "https://github.com/prdlk/leetcode/issues/38" companies: - { name: "Meta", period: "Thirty Days", frequency: 63.8 } - { name: "Google", period: "Thirty Days", frequency: 50.2 } - { name: "Visa", period: "Three Months", frequency: 80.9 } - { name: "Bloomberg", period: "Three Months", frequency: 74.8 } - { name: "Salesforce", period: "Three Months", frequency: 64.7 } - { name: "Amazon", period: "Three Months", frequency: 57.1 } - { name: "Microsoft", period: "Three Months", frequency: 48.3 } - { name: "Accenture", period: "Six Months", frequency: 100 } - { name: "IBM", period: "Six Months", frequency: 94.5 } - { name: "Infosys", period: "Six Months", frequency: 76.3 } - { name: "Apple", period: "Six Months", frequency: 74.7 } - { name: "josh technology", period: "Six Months", frequency: 74 } - { name: "Walmart Labs", period: "Six Months", frequency: 70.5 } - { name: "Yandex", period: "Six Months", frequency: 69.2 } sidebar: label: 'Subarray Sum Equals K' badge: 'Medium' --- ### 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 }; ```