Subarray Sum Equals K Using Hash Map in DSA C# - Time & Space Complexity
We want to understand 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) {
var count = 0;
var sum = 0;
var map = new Dictionary<int, int>();
map[0] = 1;
foreach (var num in nums) {
sum += num;
if (map.ContainsKey(sum - k)) {
count += map[sum - k];
}
map[sum] = map.GetValueOrDefault(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, checking and updating the hash map.
- How many times: Exactly once for each element in the array (n times).
Each new element adds a fixed amount of work: updating sums and hash map lookups.
| 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 doubles the work.
Time Complexity: O(n)
This means the time to finish grows in a straight line with the size of the input array.
[X] Wrong: "Because there is a nested check inside the loop, the time is O(n²)."
[OK] Correct: The inner check is a quick hash map lookup, which is on average O(1), so it does not multiply the loop time.
Understanding this pattern shows you can use extra memory smartly to speed up searching problems, a key skill in coding interviews.
"What if we replaced the hash map with a list and searched it each time? How would the time complexity change?"
Practice
Subarray Sum Equals K problem?Solution
Step 1: Understand the problem goal
The problem wants to find subarrays whose sums equal a target value k.Step 2: Role of hash map in solution
The hash map stores cumulative sums seen so far and how many times they occurred, enabling quick checks for needed sums.Final Answer:
To store cumulative sums and their frequencies for quick lookup -> Option AQuick Check:
Hash map stores sums = A [OK]
- Thinking hash map stores array elements directly
- Assuming sorting is needed
- Using hash map to reverse array
Solution
Step 1: Identify correct C# dictionary syntax
C# usesDictionary<TKey, TValue>withnew Dictionary<TKey, TValue>()to declare hash maps.Step 2: Check each option
Dictionary sumCounts = new Dictionary(); uses correct generic syntax. Options B and C use Java-like syntax. Dictionary sumCounts = new Dictionary(); misses generic types.Final Answer:
Dictionary sumCounts = new Dictionary(); -> Option AQuick Check:
C# Dictionary syntax = A [OK]
- Using Java HashMap syntax in C#
- Omitting generic type parameters
- Using non-existent Map type in C#
int[] nums = {1, 2, 3};
int k = 3;
int count = 0;
Dictionary sumCounts = new Dictionary();
sumCounts[0] = 1;
int sum = 0;
foreach (int num in nums) {
sum += num;
if (sumCounts.ContainsKey(sum - k)) {
count += sumCounts[sum - k];
}
if (sumCounts.ContainsKey(sum)) {
sumCounts[sum]++;
} else {
sumCounts[sum] = 1;
}
}
Console.WriteLine(count);Solution
Step 1: Calculate cumulative sums and check counts
nums = [1,2,3], k=3. sumCounts starts with {0:1}. - sum=1: sum-k= -2 (not in sumCounts), count=0, sumCounts={0:1,1:1} - sum=3: sum-k=0 (in sumCounts=1), count=1, sumCounts={0:1,1:1,3:1} - sum=6: sum-k=3 (in sumCounts=1), count=2, sumCounts={0:1,1:1,3:1,6:1}Step 2: Final count of subarrays with sum k
Count is 2 because subarrays [1,2] and [3] sum to 3.Final Answer:
2 -> Option DQuick Check:
Subarrays count = 2 [OK]
- Not initializing sumCounts with {0:1}
- Forgetting to update count correctly
- Misunderstanding sum-k lookup
int[] nums = {1, 1, 1};
int k = 2;
int count = 0;
Dictionary sumCounts = new Dictionary();
int sum = 0;
foreach (int num in nums) {
sum += num;
if (sumCounts.ContainsKey(sum - k)) {
count += sumCounts[sum - k];
}
sumCounts[sum] = 1;
}
Console.WriteLine(count);Solution
Step 1: Check initialization of sumCounts
sumCounts should start with {0:1} to count subarrays starting at index 0, but here it is empty.Step 2: Check updating sumCounts inside loop
sumCounts[sum] = 1 overwrites counts instead of incrementing, but main bug is missing initial {0:1}.Final Answer:
sumCounts is not initialized with sum 0 count 1 -> Option BQuick Check:
Initialize sumCounts[0] = 1 [OK]
- Not initializing sumCounts with {0:1}
- Overwriting counts instead of incrementing
- Ignoring sum-k lookup logic
nums = {3, 4, 7, 2, -3, 1, 4, 2} and k = 7, how many subarrays sum to k using the hash map approach?Solution
Step 1: Calculate cumulative sums and track counts
Initialize sumCounts = {0:1}, sum=0, count=0. - i=0: sum=3, sum-k=-4(not found), count=0, sumCounts={0:1,3:1} - i=1: sum=7, sum-k=0(found=1), count=1, sumCounts={0:1,3:1,7:1} - i=2: sum=14, sum-k=7(found=1), count=2, sumCounts={0:1,3:1,7:1,14:1} - i=3: sum=16, sum-k=9(not found), count=2, sumCounts={0:1,3:1,7:1,14:1,16:1} - i=4: sum=13, sum-k=6(not found), count=2, sumCounts={0:1,3:1,7:1,14:1,16:1,13:1} - i=5: sum=14, sum-k=7(found=1), count=3, sumCounts[14]=2 - i=6: sum=18, sum-k=11(not found), count=3, sumCounts={0:1,3:1,7:1,14:2,16:1,13:1,18:1} - i=7: sum=20, sum-k=13(found=1), count=4, sumCounts={0:1,3:1,7:1,14:2,16:1,13:1,18:1,20:1}Step 2: Verify the counted subarrays
Subarrays summing to 7 are: - [3,4] - [7] - [7,2,-3,1] - [1,4,2] Count is 4 total.Final Answer:
4 -> Option CQuick Check:
Count subarrays with sum k = 4 [OK]
- Missing subarrays with negative numbers
- Not updating counts when sum repeats
- Forgetting to initialize sumCounts with {0:1}
Ready to prove it?
Pass the test and this pattern moves unknown
