Subarray Sum Equals K Using Hash Map in DSA Java - Time & Space Complexity
We want to know how fast the algorithm finds subarrays that add up to a target sum.
How does the time needed grow as the input array gets bigger?
Analyze the time complexity of the following code snippet.
public int subarraySum(int[] nums, int k) {
Map map = new HashMap<>();
map.put(0, 1);
int count = 0, sum = 0;
for (int num : nums) {
sum += num;
if (map.containsKey(sum - k)) {
count += map.get(sum - k);
}
map.put(sum, map.getOrDefault(sum, 0) + 1);
}
return count;
}
This code counts how many continuous parts of the array add up exactly to k using a hash map.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: One loop through the array elements.
- How many times: Exactly once for each element in the array.
As the array gets longer, the loop runs once per element, doing a few quick checks each time.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 checks and updates |
| 100 | About 100 checks and updates |
| 1000 | About 1000 checks and updates |
Pattern observation: The work grows directly with the number of elements, so doubling the input roughly doubles the work.
Time Complexity: O(n)
This means the time to finish grows in a straight line with the input size; more elements mean proportionally more work.
[X] Wrong: "Because there is a nested check inside the loop, the time is O(n²)."
[OK] Correct: The inner check uses a hash map lookup, which is very fast and does not loop over the array again, so it stays O(n).
Understanding this pattern helps you solve many problems where you track sums or counts efficiently, a skill valued in interviews and real projects.
"What if we replaced the hash map with a list to store sums? How would the time complexity change?"
Practice
Subarray Sum Equals K problem?Solution
Step 1: Understand the problem requirement
The problem requires finding the number of continuous subarrays whose sum equals a target value k.Step 2: Role of hash map in solution
The hash map stores cumulative sums encountered so far and their counts, allowing quick checks if a subarray sum equals k by checking if (current_sum - k) exists.Final Answer:
To store cumulative sums and their frequencies for quick lookup -> Option AQuick Check:
Hash map stores sums for fast subarray sum checks [OK]
- Thinking hash map stores array elements as keys
- Assuming sorting is needed
- Using hash map to track max length instead of counts
Solution
Step 1: Check Java generics syntax
Java requires wrapper classes like Integer for generics, and diamond operator <> is used for type inference.Step 2: Identify correct initialization
HashMap map = new HashMap<>(); uses HashMap map = new HashMap<>(); which is correct and modern syntax.Final Answer:
HashMap map = new HashMap<>(); -> Option CQuick Check:
Use wrapper classes and diamond operator for HashMap [OK]
- Using primitive types int in generics
- Missing diamond operator <>
- Incorrect constructor syntax
int[] nums = {1, 2, 3};
int k = 3;
int count = 0;
HashMap map = new HashMap<>();
map.put(0, 1);
int sum = 0;
for (int num : nums) {
sum += num;
if (map.containsKey(sum - k)) {
count += map.get(sum - k);
}
map.put(sum, map.getOrDefault(sum, 0) + 1);
}
System.out.println(count);Solution
Step 1: Calculate cumulative sums and check subarrays
nums = [1,2,3], k=3 - sum=1, map has 0:1, sum-k=1-3=-2 not in map - sum=3, sum-k=0 in map with count 1, count=1 - sum=6, sum-k=3 in map with count 1, count=2Step 2: Final count of subarrays with sum k
Two subarrays sum to 3: [1,2] and [3].Final Answer:
2 -> Option BQuick Check:
Two subarrays sum to k=3 [OK]
- Not initializing map with (0,1)
- Forgetting to update count correctly
- Misunderstanding cumulative sum logic
int[] nums = {1, -1, 0};
int k = 0;
int count = 0;
HashMap map = new HashMap<>();
int sum = 0;
for (int num : nums) {
sum += num;
if (map.containsKey(sum - k)) {
count += map.get(sum - k);
}
map.put(sum, 1);
}
System.out.println(count);Solution
Step 1: Check map initialization
The map should start with (0,1) to count subarrays starting at index 0. This is missing here.Step 2: Check map update logic
Also, map.put(sum, 1) overwrites counts instead of incrementing. But the main error is missing initial (0,1).Final Answer:
Missing initialization of map with (0,1) -> Option DQuick Check:
Initialize map with (0,1) to count empty prefix sum [OK]
- Not initializing map with (0,1)
- Overwriting counts instead of incrementing
- Confusing sum-k with sum+k
nums = {3, 4, 7, 2, -3, 1, 4, 2} and k = 7, how many continuous subarrays sum to k? Use the hash map approach to find the answer.Solution
Step 1: Calculate cumulative sums and track counts
Initialize map with (0,1), sum=0, count=0 Iterate nums: - sum=3, sum-k=-4 not in map, map[3]=1 - sum=7, sum-k=0 in map(1), count=1, map[7]=1 - sum=14, sum-k=7 in map(1), count=2, map[14]=1 - sum=16, sum-k=9 not in map, map[16]=1 - sum=13, sum-k=6 not in map, map[13]=1 - sum=14, sum-k=7 in map(1), count=3, map[14]=2 - sum=18, sum-k=11 not in map, map[18]=1 - sum=20, sum-k=13 in map(1), count=4, map[20]=1Step 2: Identify subarrays
Four subarrays sum to 7: [3,4], [7], [7,2,-3,1], [1,4,2].Final Answer:
4 -> Option AQuick Check:
Count subarrays with sum k using cumulative sums [OK]
- Missing subarrays with negative numbers
- Not updating counts correctly when sum repeats
- Forgetting to initialize map with (0,1)
Ready to prove it?
Pass the test and this pattern moves unknown
