Subarray Sum Equals K
Problem Statement
You’re a sum seeker with an array of integers and a target k. How many contiguous subarrays sum to k? This medium-level hashing challenge is a prefix-sum party—use a map to tally those matches!
Example
Input: nums = [1, 1, 1], k = 2
Output: 2 ([1,1], [1,1])
Input: nums = [1, 2, 3], k = 3
Output: 2 ([1,2], [3])
Input: nums = [1, -1, 0], k = 0
Output: 3 ([1,-1], [1,-1,0], [0])
Code
Java
Python
JavaScript
public class Solution { public int subarraySum(int[] nums, int k) { MapsumFreq = new HashMap<>(); sumFreq.put(0, 1); // Empty subarray int sum = 0, count = 0; for (int num : nums) { sum += num; count += sumFreq.getOrDefault(sum - k, 0); sumFreq.put(sum, sumFreq.getOrDefault(sum, 0) + 1); } return count; } }
from collections import defaultdict def subarray_sum(nums, k): sum_freq = defaultdict(int) sum_freq[0] = 1 curr_sum, count = 0, 0 for num in nums: curr_sum += num count += sum_freq[curr_sum - k] sum_freq[curr_sum] += 1 return count
function subarraySum(nums, k) { let sumFreq = new Map([[0, 1]]); let sum = 0, count = 0; for (let num of nums) { sum += num; count += (sumFreq.get(sum - k) || 0); sumFreq.set(sum, (sumFreq.get(sum) || 0) + 1); } return count; }
Explanation
- Hashing Insight: Track cumulative sums; if sum-k exists, a subarray sums to k.
- Flow: Update running sum, check map for sum-k, increment its freq.
- Example Walkthrough: [1,1,1], k=2 → sums=1,2,3, map={0:1,1:1,2:1,3:1}, count=2.
- Key Detail: sumFreq[0]=1 handles subarrays starting at index 0.
- Negatives: Works with negative numbers seamlessly.
Note
Time complexity: O(n), Space complexity: O(n). A prefix-sum powerhouse with hashing flair!