Two Sum Problem Classic Hash Solution in DSA Go - Time & Space Complexity
We want to understand how the time needed to find two numbers that add up to a target grows as the list gets bigger.
How does the solution's speed change when the input size increases?
Analyze the time complexity of the following code snippet.
func twoSum(nums []int, target int) []int {
seen := make(map[int]int)
for i, num := range nums {
complement := target - num
if j, ok := seen[complement]; ok {
return []int{j, i}
}
seen[num] = i
}
return nil
}
This code finds two numbers in the list that add up to the target using a hash map for quick lookups.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Single loop through the list of numbers.
- How many times: Exactly once for each number in the list.
- Additional operation: Constant-time hash map lookups and insertions inside the loop.
As the list grows, the number of steps grows roughly the same as the list size.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 loop steps and 10 hash operations |
| 100 | About 100 loop steps and 100 hash operations |
| 1000 | About 1000 loop steps and 1000 hash operations |
Pattern observation: The work grows linearly with the input size; doubling the list roughly doubles the work.
Time Complexity: O(n)
This means the time to find the two numbers grows in direct proportion to the size of the input list.
[X] Wrong: "Because there is a loop inside a loop, the time complexity is O(n²)."
[OK] Correct: The code uses a hash map for quick lookups, so it does not have a nested loop; each lookup is fast and does not depend on the list size.
Understanding this solution shows you how to use extra space to speed up searching, a common and useful skill in coding problems.
"What if the input list was already sorted? How would that change the time complexity if we used a two-pointer approach instead?"
Practice
Two Sum Problem Classic Hash Solution?Solution
Step 1: Understand the problem goal
The goal is to find two numbers in the array that add up to a target value.Step 2: Use a hash map for efficient lookup
By storing each number and its index in a hash map, we can check if the complement (target - current number) exists quickly.Final Answer:
Use a hash map to store numbers and their indices for quick lookup -> Option AQuick Check:
Hash map lookup = fast pair finding [OK]
- Trying to use nested loops which is slower
- Sorting the array which is unnecessary here
- Not storing indices with numbers
Solution
Step 1: Recall Go map initialization syntax
Maps in Go are initialized using the built-in make function like make(map[keyType]valueType).Step 2: Identify correct syntax
m := make(map[int]int) uses make(map[int]int) which is the correct way to create an empty map with int keys and int values.Final Answer:
m := make(map[int]int) -> Option CQuick Check:
make(map[int]int) = correct map init [OK]
- Using var without make causes nil map
- Incorrect syntax like map[int]int(make())
- Using empty braces without make in some contexts
func twoSum(nums []int, target int) []int {
m := make(map[int]int)
for i, num := range nums {
if j, ok := m[target-num]; ok {
return []int{j, i}
}
m[num] = i
}
return nil
}
fmt.Println(twoSum([]int{2, 7, 11, 15}, 9))Solution
Step 1: Trace the loop and map updates
At i=0, num=2, map is empty, so store m[2]=0.
At i=1, num=7, check if m[9-7=2] exists, yes at index 0.
Return [0,1].Step 2: Confirm returned indices
The function returns indices of numbers 2 and 7 which sum to 9, so output is [0 1].Final Answer:
[0 1] -> Option BQuick Check:
Indices of 2 and 7 = [0 1] [OK]
- Returning indices in wrong order
- Not checking map before insertion
- Returning nil when pair exists
func twoSum(nums []int, target int) []int {
m := make(map[int]int)
for i, num := range nums {
if j, ok := m[num-target]; ok {
return []int{j, i}
}
m[num] = i
}
return nil
}Solution
Step 1: Analyze complement calculation
The complement to find is target - current number, not num - target, because we want a number that adds with num to target.Step 2: Identify the fix
Change m[num-target] to m[target-num] to correctly check for the complement in the map.Final Answer:
The complement calculation should be target - num, not num - target -> Option AQuick Check:
Complement = target - num [OK]
- Swapping target and num in complement
- Incorrect map initialization
- Returning nil too early
nums = [3, 3, 4, 2] and target 6, what will the Two Sum Classic Hash Solution return?Consider the code below:
func twoSum(nums []int, target int) []int {
m := make(map[int]int)
for i, num := range nums {
if j, ok := m[target-num]; ok {
return []int{j, i}
}
m[num] = i
}
return nil
}Solution
Step 1: Trace the loop with given input
i=0, num=3, map empty, store m[3]=0.
i=1, num=3, check m[6-3=3], found at index 0, return [0,1].Step 2: Confirm returned indices
Indices 0 and 1 correspond to values 3 and 3 which sum to 6, so output is [0 1].Final Answer:
[0 1] -> Option DQuick Check:
3 + 3 = 6 at indices [0 1] [OK]
- Assuming different pairs without checking map
- Returning nil when pair exists
- Confusing indices order
Ready to prove it?
Pass the test and this pattern moves unknown
