Table of Contents
- Understanding the Two Sum Problem
- Brute Force Approach
- Optimized Hash Map Solution
- Python Implementation
- Testing the Solution
- Conclusion
Understanding the Two Sum Problem
The Two Sum problem is a classic coding challenge often encountered in technical interviews. You’re given an array of integers nums
and a target integer target
. Your task is to find two numbers in the array that add up to the target and return their indices as an array [index1, index2]
. The problem guarantees exactly one solution, and you cannot use the same element twice.
Example:
- Input:
nums = [2, 7, 11, 15], target = 9
- Output:
[0, 1]
(becausenums[0] + nums[1] = 2 + 7 = 9
)
This problem tests your ability to manipulate arrays, optimize algorithms, and leverage data structures effectively.
Brute Force Approach
A straightforward way to solve Two Sum is to check every possible pair of numbers in the array.
-
How it works:
- Use two nested loops to iterate through all pairs
(i, j)
wherei < j
. - For each pair, check if
nums[i] + nums[j] == target
. - If a match is found, return
[i, j]
.
- Use two nested loops to iterate through all pairs
-
Pros: Simple and intuitive.
- Cons: Inefficient with a time complexity of O(n²) due to the nested loops.
- Space Complexity: O(1), as it only stores the result.
While this approach works, it’s not ideal for large arrays, which leads us to a better solution.
Optimized Hash Map Solution
To improve efficiency, we can use a hash map to reduce the time complexity to O(n).
-
How it works:
- Initialize an empty hash map to store numbers and their indices.
- Iterate through the array once.
- For each number
nums[i]
, compute its complement (target - nums[i]
). - If the complement exists in the hash map, return
[hash_map[complement], i]
. - Otherwise, add
nums[i]
and its indexi
to the hash map.
-
Pros: Linear time complexity O(n), as we only traverse the array once, and hash map operations are O(1) on average.
- Cons: Uses O(n) space to store the hash map.
- Why it’s better: It’s significantly faster for large inputs, making it the preferred solution in interviews.
This approach showcases your ability to trade space for time and use data structures effectively.
Python Implementation
Here’s the Python code for the hash map solution:
def twoSum(nums, target):
hash_map = {}
for i, num in enumerate(nums):
complement = target - num
if complement in hash_map:
return [hash_map[complement], i]
hash_map[num] = i
return [] # Included for robustness, though problem guarantees a solution
This code is concise, readable, and efficient, making it ideal for coding interviews.
Testing the Solution
To ensure our solution is robust, we’ll use Python’s unittest
module to test various scenarios, including basic cases, negative numbers, duplicates, and larger arrays.
import unittest
class TestTwoSum(unittest.TestCase):
def test_basic_case(self):
self.assertEqual(twoSum([2, 7, 11, 15], 9), [0, 1])
def test_negative_numbers(self):
self.assertEqual(twoSum([-3, 4, 3, 90], 0), [0, 2])
def test_duplicate_numbers(self):
self.assertEqual(twoSum([3, 3], 6), [0, 1])
def test_single_solution(self):
self.assertEqual(twoSum([1, 2, 3, 4], 7), [2, 3])
def test_larger_array(self):
self.assertEqual(twoSum([1, 5, 5, 5, 10], 10), [1, 4])
if __name__ == '__main__':
unittest.main()
- Test Cases Explained:
- Basic Case: Verifies the standard example (
[2, 7, 11, 15]
,target = 9
→[0, 1]
). - Negative Numbers: Ensures handling of negative numbers (
[-3, 4, 3, 90]
,target = 0
→[0, 2]
). - Duplicate Numbers: Checks cases with identical numbers (
[3, 3]
,target = 6
→[0, 1]
). - Single Solution: Tests a non-initial solution (
[1, 2, 3, 4]
,target = 7
→[2, 3]
). - Larger Array: Validates with multiple similar numbers (
[1, 5, 5, 5, 10]
,target = 10
→[1, 4]
).
- Basic Case: Verifies the standard example (
Running these tests confirms the solution handles all edge cases correctly.
Conclusion
The Two Sum problem is an excellent way to practice algorithmic thinking and optimization. While the brute force approach is a good starting point, the hash map solution demonstrates how to achieve efficiency with smart data structure usage. By pairing the solution with thorough test cases, you can confidently tackle this problem in coding interviews or real-world applications.
Mastering Two Sum not only prepares you for interviews but also builds a foundation for solving more complex problems. Keep practicing, and you’ll be ready to impress with your coding skills!