📖 Scenario: You are helping a water storage company to find the best container shape. They have vertical lines representing walls of different heights. You want to find two walls that together with the x-axis form a container that holds the most water.
🎯 Goal: Build a Rust program that finds the maximum amount of water that can be contained between two vertical lines in a list of heights.
📋 What You'll Learn
Create a vector called heights with the exact values [1, 8, 6, 2, 5, 4, 8, 3, 7].
Create two variables left and right to represent the start and end indices of the vector.
Use a while loop to move left and right pointers to find the maximum water container.
Print the maximum water amount found.
💡 Why This Matters
🌍 Real World
This problem models how to find the best container shape to hold the most water, useful in design and engineering.
💼 Career
Understanding two-pointer techniques and optimization is important for software engineering interviews and real-world algorithmic problem solving.
Progress0 / 4 steps
1
Create the heights vector
Create a vector called heights with the exact values [1, 8, 6, 2, 5, 4, 8, 3, 7].
DSA Rust
Hint
Use let heights = vec![...] to create the vector.
2
Initialize left and right pointers
Create two variables called left and right. Set left to 0 and right to the last index of heights.
DSA Rust
Hint
Use let mut to create variables that will change.
3
Find the maximum water container
Create a variable called max_area and set it to 0. Use a while loop with the condition left < right. Inside the loop, calculate the current area using the minimum height between heights[left] and heights[right] multiplied by the distance between right and left. Update max_area if the current area is larger. Move left forward if heights[left] is less than heights[right], otherwise move right backward.
DSA Rust
Hint
Use while left < right and update max_area inside the loop.
4
Print the maximum water area
Add a println! statement to display the value of max_area.
DSA Rust
Hint
Use println!("{}", max_area); to print the result.
Practice
(1/5)
1. What does the problem Container With Most Water ask you to find given an array of heights?
easy
A. The maximum area formed between two vertical lines and the x-axis
B. The minimum height in the array
C. The sum of all heights
D. The longest increasing subsequence of heights
Solution
Step 1: Understand the problem statement
The problem asks to find two lines that together with the x-axis form a container holding the most water, which means maximizing the area between them.
Step 2: Identify what to calculate
The area is calculated by the distance between the two lines multiplied by the smaller height of the two lines.
Final Answer:
The maximum area formed between two vertical lines and the x-axis -> Option A
Quick Check:
Container with most water = max area between lines [OK]
Hint: Look for two lines maximizing width x min height [OK]
Common Mistakes:
Confusing sum of heights with area
Choosing tallest lines without considering distance
Ignoring the smaller height between two lines
2. Which Rust code snippet correctly declares a vector of heights for the Container With Most Water problem?
easy
A. let heights = {1, 8, 6, 2, 5, 4, 8, 3, 7};
B. let heights = vec![1, 8, 6, 2, 5, 4, 8, 3, 7];
C. let heights = (1, 8, 6, 2, 5, 4, 8, 3, 7);
D. let heights = [1, 8, 6, 2, 5, 4, 8, 3, 7];
Solution
Step 1: Identify Rust vector syntax
In Rust, a vector is declared using vec![...] macro to create a growable array.
Step 2: Check each option
let heights = vec![1, 8, 6, 2, 5, 4, 8, 3, 7]; uses vec![...] correctly. let heights = [1, 8, 6, 2, 5, 4, 8, 3, 7]; is an array, not a vector. let heights = (1, 8, 6, 2, 5, 4, 8, 3, 7); is a tuple. let heights = {1, 8, 6, 2, 5, 4, 8, 3, 7}; uses braces which is invalid syntax.
Final Answer:
let heights = vec![1, 8, 6, 2, 5, 4, 8, 3, 7]; -> Option B
Quick Check:
Vector syntax = vec![...] [OK]
Hint: Use vec![...] for vectors in Rust [OK]
Common Mistakes:
Using array syntax instead of vector
Using tuple parentheses instead of brackets
Using braces which is invalid
3. What is the output of this Rust code snippet that finds the max water container area?
fn max_area(height: Vec<i32>) -> i32 {
let mut left = 0;
let mut right = height.len() - 1;
let mut max_area = 0;
while left < right {
let width = (right - left) as i32;
let h = if height[left] < height[right] { height[left] } else { height[right] };
let area = width * h;
if area > max_area {
max_area = area;
}
if height[left] < height[right] {
left += 1;
} else {
right -= 1;
}
}
max_area
}
fn main() {
let heights = vec![1,8,6,2,5,4,8,3,7];
println!("{}", max_area(heights));
}
medium
A. 48
B. 56
C. 64
D. 49
Solution
Step 1: Understand the two-pointer approach
Start with left at 0 and right at last index, calculate area, move pointer with smaller height inward.
Step 2: Trace the code with given heights
Max area found is between height 8 at index 1 and height 7 at index 8, width = 7, area = 7 * 7 = 49.
Final Answer:
49 -> Option D
Quick Check:
Max area = 49 [OK]
Hint: Use two pointers, move smaller height inward [OK]
Common Mistakes:
Calculating area with max height instead of min
Not updating max area correctly
Moving wrong pointer in the loop
4. Identify the bug in this Rust function for Container With Most Water and select the fix:
fn max_area(height: Vec<i32>) -> i32 {
let mut left = 0;
let mut right = height.len();
let mut max_area = 0;
while left < right {
let width = (right - left) as i32;
let h = if height[left] < height[right] { height[left] } else { height[right] };
let area = width * h;
if area > max_area {
max_area = area;
}
if height[left] < height[right] {
left += 1;
} else {
right -= 1;
}
}
max_area
}
medium
A. Change right initialization to height.len() - 1
B. Change while condition to left <= right
C. Use max instead of min height for area calculation
D. Remove the if condition inside the loop
Solution
Step 1: Check initialization of right pointer
Rust vectors are zero-indexed, so last index is length - 1, not length.
Step 2: Identify impact of wrong right pointer
Using length causes out-of-bounds access when accessing height[right], leading to runtime error.
Final Answer:
Change right initialization to height.len() - 1 -> Option A
Quick Check:
Right pointer = last index = len() - 1 [OK]
Hint: Index last element with len() - 1, not len() [OK]
Common Mistakes:
Using length as index causing panic
Changing loop condition incorrectly
Using max height instead of min for area
5. Given a vector of heights, how would you modify the two-pointer approach to also return the indices of the two lines forming the container with the most water?
hard
A. Return the sum of the two heights instead of area
B. Use a nested loop to check all pairs and store indices of max area
C. Keep track of max_area and update a tuple (left_index, right_index) whenever max_area changes
D. Only return the left pointer index as the answer
Solution
Step 1: Understand the two-pointer approach
We move pointers inward and calculate area at each step, updating max area found.
Step 2: Track indices when max area updates
Along with max_area, store the current left and right indices whenever a larger area is found.
Final Answer:
Keep track of max_area and update a tuple (left_index, right_index) whenever max_area changes -> Option C
Quick Check:
Track indices with max area updates [OK]
Hint: Update indices when max area changes [OK]
Common Mistakes:
Returning sum instead of area
Using nested loops losing O(n) efficiency
Returning only one index instead of both
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.