Subarray Sum Equals K Using Hash Map in DSA Go - Time & Space Complexity
We want to understand how fast the algorithm finds subarrays that sum to a target value using a hash map.
How does the time needed grow as the input array gets bigger?
Analyze the time complexity of the following code snippet.
func subarraySum(nums []int, k int) int {
count, sum := 0, 0
prefixSums := map[int]int{0: 1}
for _, num := range nums {
sum += num
if val, ok := prefixSums[sum-k]; ok {
count += val
}
prefixSums[sum]++
}
return count
}
This code counts how many continuous parts of the array add up to k using a hash map to store sums seen so far.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Single loop over the array elements.
- How many times: Exactly once for each element in the input array.
Each element is processed once, and hash map lookups and inserts happen in constant time on average.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 steps |
| 100 | About 100 steps |
| 1000 | About 1000 steps |
Pattern observation: The number of steps grows roughly in direct proportion to the input size.
Time Complexity: O(n)
This means the time needed grows linearly with the size of the input array.
[X] Wrong: "Because there is a nested check inside the loop, the time complexity is O(n²)."
[OK] Correct: The inner check is a hash map lookup, which is on average constant time, so it does not multiply the loop's cost.
Understanding this pattern helps you solve many problems involving sums and counts efficiently, a valuable skill in interviews and real projects.
"What if we replaced the hash map with a list to store prefix sums? How would the time complexity change?"
Practice
Subarray Sum Equals K problem?Solution
Step 1: Understand the problem goal
The problem requires finding subarrays whose sums equal a target value k.Step 2: Role of hash map in solution
A hash map stores cumulative sums seen so far and their counts, enabling quick checks if a previous sum exists that forms a subarray summing to k.Final Answer:
To store cumulative sums and their frequencies for quick lookup -> Option CQuick Check:
Hash map = cumulative sums storage [OK]
- Thinking hash map stores array elements as keys
- Assuming sorting is needed
- Confusing hash map with array for sums
Solution
Step 1: Identify correct map type for keys and values
We need a map with integer keys and integer values to store sums and counts.Step 2: Check Go syntax for map initialization
make(map[int]int)correctly creates a map with int keys and int values.Final Answer:
m := make(map[int]int) -> Option BQuick Check:
map[int]int = correct map type [OK]
- Using slice instead of map
- Wrong key or value types in map
- Using map with string keys incorrectly
nums := []int{1, 2, 3}
k := 3
count := 0
sum := 0
m := make(map[int]int)
m[0] = 1
for _, v := range nums {
sum += v
if val, ok := m[sum-k]; ok {
count += val
}
m[sum]++
}
fmt.Println(count)Solution
Step 1: Trace cumulative sums and map updates
Iteration 1: sum=1, m[1]=1, sum-k=-2 not in map, count=0 Iteration 2: sum=3, sum-k=0 in map with count 1, count=1, m[3]=1 Iteration 3: sum=6, sum-k=3 in map with count 1, count=2, m[6]=1Step 2: Final count after loop
Count is 2 because two subarrays sum to k=3: [1,2] and [3].Final Answer:
2 -> Option DQuick Check:
Subarrays summing to 3 = 2 [OK]
- Not initializing m[0] = 1
- Forgetting to increment map count
- Miscounting subarrays
nums := []int{1, 1, 1}
k := 2
count := 0
sum := 0
m := make(map[int]int)
for _, v := range nums {
sum += v
if val, ok := m[sum-k]; ok {
count += val
}
m[sum]++
}
fmt.Println(count)Solution
Step 1: Check map initialization
The map m is used to store cumulative sums, but m[0] is not initialized to 1 before the loop.Step 2: Effect of missing m[0] = 1
Without m[0] = 1, subarrays starting from index 0 that sum to k are not counted, causing incorrect count.Final Answer:
Missing initialization m[0] = 1 before loop -> Option AQuick Check:
Initialize m[0]=1 to count subarrays from start [OK]
- Not initializing m[0]
- Incrementing count incorrectly
- Using wrong map key type
nums = []int{3, 4, 7, 2, -3, 1, 4, 2} and k = 7, how many subarrays sum to k? Use the hash map approach to find the count.Solution
Step 1: Calculate cumulative sums and track counts
Initialize m[0]=1, sum=0, count=0 Iterate nums: - sum=3, sum-k=-4 not in m, m[3]=1 - sum=7, sum-k=0 in m=1, count=1, m[7]=1 - sum=14, sum-k=7 in m=1, count=2, m[14]=1 - sum=16, sum-k=9 not in m, m[16]=1 - sum=13, sum-k=6 not in m, m[13]=1 - sum=14, sum-k=7 in m=1, count=3, m[14]=2 - sum=18, sum-k=11 not in m, m[18]=1 - sum=20, sum-k=13 in m=1, count=4, m[20]=1Step 2: Verify subarrays
The subarrays summing to 7 are: [3,4], [7], [7,2,-3,1], [1,4,2]. Total count = 4.Final Answer:
4 -> Option AQuick Check:
Count subarrays with sum k = 4 [OK]
- Missing m[0] initialization
- Miscounting overlapping subarrays
- Not updating map counts correctly
Ready to prove it?
Pass the test and this pattern moves unknown
