What if you could find matching pairs instantly, no matter how big the list is?
Why Two Sum Problem Classic Hash Solution in DSA Rust?
Imagine you have a list of prices for items in a store, and you want to find two items that add up to your gift card amount. You try checking every pair manually to see if they match the total.
Checking every pair one by one takes a lot of time, especially if the list is long. It's easy to miss pairs or repeat checks, making the process slow and frustrating.
The Two Sum problem classic hash solution uses a fast lookup method to remember numbers seen so far. It quickly finds if the matching number to reach the target exists, saving time and effort.
for i in 0..nums.len() { for j in i+1..nums.len() { if nums[i] + nums[j] == target { return (i, j); } } }
use std::collections::HashMap; let mut map = HashMap::new(); for (index, &num) in nums.iter().enumerate() { if let Some(&prev_index) = map.get(&(target - num)) { return (prev_index, index); } map.insert(num, index); }
This solution makes it possible to find pairs adding to a target in just one pass, even in huge lists, making programs faster and more efficient.
Online shopping sites use this to quickly suggest pairs of products that fit your budget or special offers, improving your shopping experience.
Manual pair checking is slow and error-prone.
Hash-based lookup finds pairs quickly in one pass.
Enables fast, efficient solutions for sum problems in large data.
Practice
Solution
Step 1: Understand the role of hash map
The hash map stores each number as a key and its index as the value for quick access.Step 2: Use hash map for complement lookup
For each number, we check if the complement (target - number) exists in the hash map to find the pair.Final Answer:
To store numbers and their indices for quick lookup -> Option DQuick Check:
Hash map stores number:index pairs [OK]
- Thinking hash map sorts the array
- Trying to store sums instead of indices
- Using hash map to reverse elements
Solution
Step 1: Identify mutable hash map declaration
To insert elements, the hash map must be mutable, so use 'let mut'.Step 2: Use full path or import HashMap
Using 'std::collections::HashMap::new()' is correct if HashMap is not imported.Final Answer:
let mut map = std::collections::HashMap::new(); -> Option BQuick Check:
Mutable hash map declaration requires 'mut' [OK]
- Forgetting 'mut' keyword for mutable map
- Using HashMap without importing or full path
- Declaring map immutable when insertions needed
fn two_sum(nums: Vec<i32>, target: i32) -> Vec<i32> {
let mut map = std::collections::HashMap::new();
for (i, &num) in nums.iter().enumerate() {
if let Some(&index) = map.get(&(target - num)) {
return vec![index as i32, i as i32];
}
map.insert(num, i);
}
vec![]
}
fn main() {
let result = two_sum(vec![2, 7, 11, 15], 9);
println!("{:?}", result);
}Solution
Step 1: Iterate and check complements
At i=0, num=2, map empty, insert (2,0). At i=1, num=7, complement=9-7=2 found at index 0.Step 2: Return indices of complement pair
Return vector with indices [0,1] as the pair sums to target 9.Final Answer:
[0, 1] -> Option CQuick Check:
Indices of 2 and 7 are [0,1] [OK]
- Returning indices in wrong order
- Not casting usize to i32 for return
- Returning empty vector when pair exists
fn two_sum(nums: Vec<i32>, target: i32) -> Vec<i32> {
let mut map = std::collections::HashMap::new();
for (i, num) in nums.iter().enumerate() {
if let Some(&index) = map.get(&(target - num)) {
return vec![index as i32, i as i32];
}
map.insert(num, i);
}
vec![]
}Solution
Step 1: Check key types in hash map
Keys are i32 values, but 'num' is a reference (&i32), so insert needs dereferenced value.Step 2: Fix insertion to use dereferenced num
Change 'map.insert(num, i);' to 'map.insert(*num, i);' to insert i32 key, matching get() key type.Final Answer:
Change 'num' to '*num' in map.insert to match key type -> Option AQuick Check:
Dereference num when inserting key [OK]
- Inserting reference instead of value as key
- Changing target arithmetic incorrectly
- Making map immutable causing insert error
[3, 3, 4, 5] and target 6, what will the Two Sum classic hash solution return and why?Solution
Step 1: Check pairs for target sum
The first element 3 at index 0 is inserted. At index 1, num=3, complement=6-3=3 found at index 0.Step 2: Return indices of first matching pair
Return [0,1] because these two 3's sum exactly to 6.Final Answer:
[0, 1] because the first two 3's sum to 6 -> Option AQuick Check:
First pair summing to target returned [OK]
- Choosing pairs that don't sum to target
- Ignoring duplicate values as valid pairs
- Returning empty vector incorrectly
Ready to prove it?
Pass the test and this pattern moves unknown
