š Scenario: Imagine you have a list of numbers representing the heights of walls. You want to find two walls that can hold the most water between them. This is like finding the biggest container formed by two walls.
šÆ Goal: You will build a program that finds the maximum amount of water that can be held between two walls using the two pointer technique, and see why it is faster than checking every pair (brute force).
š What You'll Learn
Create a vector called heights with exact values: [1, 8, 6, 2, 5, 4, 8, 3, 7]
Create two variables left and right to hold the start and end indices of the vector
Use a while loop to move the pointers and calculate the area between walls
Print the maximum area found
š” Why This Matters
š Real World
This technique helps in problems involving pairs in sorted or linear data, like finding containers, pairs with sums, or merging sorted arrays.
š¼ Career
Understanding two pointer technique is essential for coding interviews and efficient algorithm design in software development.
Progress0 / 4 steps
1
Create the heights vector
Create a vector called heights with these exact values: [1, 8, 6, 2, 5, 4, 8, 3, 7]
DSA Rust
Hint
Use let heights = vec![...] to create the vector with the exact numbers.
2
Set up two pointers
Create two variables called left and right. Set left to 0 and right to the last index of heights (which is 8).
DSA Rust
Hint
Use let mut to create variables that can change. heights.len() - 1 gives the last index.
3
Find maximum water using two pointers
Use a while loop that runs while left < right. Inside the loop, calculate the area between heights[left] and heights[right] multiplied by the distance between right and left. Keep track of the maximum area in a variable called max_area. Move the pointer that points to the smaller height inward by 1.
DSA Rust
Hint
Use while left < right and update max_area inside the loop. Move the pointer with smaller height.
4
Print the maximum area
Print the value of max_area using println!.
DSA Rust
Hint
Use println!("{}", max_area); to print the maximum area.
Practice
(1/5)
1. What is the main advantage of the two pointer technique over brute force in array problems?
easy
A. It always finds the maximum element in the array
B. It reduces time complexity by avoiding nested loops
C. It requires sorting the array first in all cases
D. It uses more memory to store intermediate results
Solution
Step 1: Understand brute force approach
Brute force often uses nested loops, leading to higher time complexity like O(n²).
Step 2: Compare with two pointer technique
Two pointer technique uses two indices moving through the array, reducing complexity to O(n).
Final Answer:
It reduces time complexity by avoiding nested loops -> Option B
Quick Check:
Two pointer = faster than brute force [OK]
Hint: Two pointers move linearly, avoiding double loops [OK]
Common Mistakes:
Thinking two pointer always needs sorting
Confusing memory use with speed
Assuming it finds max element always
2. Which of the following is the correct Rust syntax to initialize two pointers at the start and end of a vector named nums?
easy
A. let (mut left, mut right) = (0, nums.len() - 1);
B. let left = 0; let right = nums.len();
C. let (left, right) = (nums[0], nums[nums.len()]);
D. let mut left = nums.len() - 1; let mut right = 0;
Solution
Step 1: Identify pointer initialization
Two pointers are indices, so left starts at 0 and right at last index (length - 1).
Step 2: Check Rust syntax correctness
let (mut left, mut right) = (0, nums.len() - 1); correctly declares mutable variables with proper tuple assignment and index calculation.
Final Answer:
let (mut left, mut right) = (0, nums.len() - 1); -> Option A
Hint: Pointers are indices: start=0, end=length-1 [OK]
Common Mistakes:
Using nums.len() instead of nums.len() - 1 for last index
Assigning values from vector elements instead of indices
Not declaring pointers as mutable when needed
3. What will be the output of the following Rust code snippet?
let nums = vec![1, 2, 3, 4, 5];
let mut left = 0;
let mut right = nums.len() - 1;
let mut sum_pairs = Vec::new();
while left < right {
sum_pairs.push(nums[left] + nums[right]);
left += 1;
right -= 1;
}
println!("{:?}", sum_pairs);
medium
A. [5, 6, 7]
B. [6, 7]
C. [5, 7]
D. [6, 6]
Solution
Step 1: Trace pointer movements and sums
Initially left=0, right=4; sums: nums[0]+nums[4]=1+5=6; then left=1, right=3; sums: 2+4=6; loop stops when left=2, right=2.
Step 2: Collect sums in vector
sum_pairs contains [6, 6] after loop ends.
Final Answer:
[6, 6] -> Option D
Quick Check:
Pairs sum = [6, 6] [OK]
Hint: Sum pairs from ends moving inward [OK]
Common Mistakes:
Including middle element sum when left == right
Miscalculating indices or sums
Assuming loop runs when left == right
4. Identify the bug in this Rust code using two pointers to find if a pair sums to 10:
let nums = vec![1, 3, 5, 7, 9];
let mut left = 0;
let mut right = nums.len();
while left < right {
let sum = nums[left] + nums[right];
if sum == 10 {
println!("Found");
break;
} else if sum < 10 {
left += 1;
} else {
right -= 1;
}
}
medium
A. right is initialized to nums.len(), which is out of bounds
B. left pointer should start at nums.len() - 1
C. The loop condition should be left <= right
D. The sum calculation should use nums[left] - nums[right]
Solution
Step 1: Check pointer initialization
right is set to nums.len(), which is one past the last valid index (out of bounds).
Step 2: Correct pointer initialization
right should be nums.len() - 1 to point to last element.
Final Answer:
right is initialized to nums.len(), which is out of bounds -> Option A
Quick Check:
Index out of bounds error = right is initialized to nums.len(), which is out of bounds [OK]
Hint: Last index = length - 1, not length [OK]
Common Mistakes:
Using length as index causing runtime panic
Changing loop condition incorrectly
Misusing sum calculation operator
5. Given a sorted vector nums, how can the two pointer technique be used to find all unique pairs that sum to a target value without duplicates?
hard
A. Sort the vector first, then use a hash map to find complements
B. Use nested loops to check all pairs and store unique pairs in a set
C. Use two pointers from start and end, move inward skipping duplicates after finding a pair
D. Use a single pointer and binary search for complement for each element
Solution
Step 1: Initialize two pointers at start and end
Set left = 0 and right = nums.len() - 1 to scan pairs from both ends.
Step 2: Move pointers inward and skip duplicates
When a pair sums to target, record it, then move pointers skipping over duplicate values to avoid repeated pairs.
Final Answer:
Use two pointers from start and end, move inward skipping duplicates after finding a pair -> Option C
Quick Check:
Two pointer + skip duplicates = unique pairs [OK]
Hint: Skip duplicates after finding pairs to avoid repeats [OK]
Common Mistakes:
Using nested loops causing slow performance
Not skipping duplicates leading to repeated pairs
Using hash map or binary search unnecessarily
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.