Browse curriculum

FAANGPrep Sprint

Subarray Sum Equals K

Count the contiguous subarrays whose sum equals k in one pass, using a running prefix sum and a hash map of the sums seen so far.

Problem Understanding

Count the contiguous, non-empty subarrays of the integer array nums whose elements add up to exactly k.

Strategy (HashMap + Prefix Sum)

We want Sum(i, j) == k.
Since Sum(i, j) = Prefix[j] - Prefix[i-1], we want:
Prefix[j] - Prefix[i-1] == k
=> Prefix[i-1] == Prefix[j] - k.

Algorithm:

  • Iterate through array, maintaining current_sum.

  • Check HashMap: how many times have we seen current_sum - k before?

  • Add that count to our answer.

  • Add current_sum to the HashMap.

Interactive Visualization

K = 2

SEED MAP

nums

1

0

1

1

1

2

sum through i

-

0

-

1

-

2

Sum

0

Sum − k

—

Count

0

Map (sum:times seen)

0:1

Subarrays found here

None on this step

 

Count subarrays summing to 2. The map starts as {0: 1}: the empty prefix, so a subarray can start at index 0

Next

Add nums[0] = 1: running sum 1

Array

Target

Legend & Complexity

The element just added to the running sum

Every element of a subarray found on this step

3:1

Map entry: a prefix sum and how many times it has been seen

Time

O(N)

Space

O(N)

Each step adds one number to the running sum and looks up how many earlier prefix sums equal sum - k. Every one of them starts a subarray that ends here; the figure outlines each match.

Edge Cases

Watch out for:

  • Negative Numbers: Prefix sums are not monotonic! Cannot use Sliding Window (Two Pointers). Must use HashMap.

  • k = 0: Subarrays with sum 0 are valid.

  • Zeroes: Multiple zeroes increase count significantly.

Dry Run

Nums: [1, 1, 1], k=2. Map: {0:1}. Count=0. sum=0.

Num New Sum Check (Sum-k) Map Has Check? Action Map Update
1 1 1 - 2 = -1 No - {0:1, 1:1}
1 2 2 - 2 = 0 Yes (val=1) Count += 1 {0:1, 1:1, 2:1}
1 3 3 - 2 = 1 Yes (val=1) Count += 1 {0:1, 1:1, 2:1, 3:1}

Result: 2.

Solution

O(N) Time, O(N) Space.

Subarray Sum Equals K Code
1var subarraySum = function(nums, k) {
2 let count = 0;
3 let currSum = 0;
4 const map = new Map();
5 map.set(0, 1);
6
7 for (const num of nums) {
8 currSum += num;
9
10 if (map.has(currSum - k)) {
11 count += map.get(currSum - k);
12 }
13
14 map.set(currSum, (map.get(currSum) || 0) + 1);
15 }
16 return count;
17};