📖 Scenario: Imagine you have a row of vertical lines on a flat surface. Each line has a certain height. You want to find two lines that, together with the surface, can hold the most water between them.
🎯 Goal: Build a program that finds the maximum amount of water that can be trapped between two lines from a list of line heights.
📋 What You'll Learn
Create a slice called heights with the exact values: 1, 8, 6, 2, 5, 4, 8, 3, 7
Create two integer variables called left and right to represent the start and end indexes of the slice
Write a loop that moves left and right pointers to find the maximum water container
Print the maximum water amount as an integer
💡 Why This Matters
🌍 Real World
This problem models situations where you want to find the best container or boundary to hold the maximum volume, such as in water storage or land plotting.
💼 Career
Understanding two-pointer techniques and array manipulation is important for coding interviews and real-world software development tasks involving optimization.
Progress0 / 4 steps
1
Create the heights slice
Create a slice of integers called heights with these exact values: 1, 8, 6, 2, 5, 4, 8, 3, 7
DSA Go
Hint
Use heights := []int{...} to create the slice with the exact numbers.
2
Set left and right pointers
Create two integer variables called left and right. Set left to 0 and right to the last index of heights.
DSA Go
Hint
Use left := 0 and right := len(heights) - 1 to set the pointers.
3
Find the maximum water container
Create an integer variable called maxArea and set it to 0. Use a for loop that runs while left < right. Inside the loop, calculate the area between left and right lines, update maxArea if the area is larger, and move the pointer that points to the shorter line.
DSA Go
Hint
Use a loop with left < right. Calculate area as height * width. Move the pointer with the smaller height.
4
Print the maximum water amount
Use fmt.Println(maxArea) to print the maximum water amount. Remember to import the fmt package at the top.
DSA Go
Hint
Use fmt.Println(maxArea) to show the result. Don't forget to import fmt.
Practice
(1/5)
1. What does the problem Container With Most Water ask you to find given an array of heights?
easy
A. The sum of all heights
B. The minimum height in the array
C. The maximum area of water that can be contained between two lines
D. The number of lines taller than a given height
Solution
Step 1: Understand the problem statement
The problem asks to find two lines which together with the x-axis form a container that holds the most water.
Step 2: Identify what to calculate
We calculate the area between two lines as the width between them times the smaller height.
Final Answer:
The maximum area of water that can be contained between two lines -> Option C
Quick Check:
Container with most water = maximum area [OK]
Hint: Focus on max area between two heights, not sum or count [OK]
Common Mistakes:
Confusing max area with sum of heights
Ignoring the smaller height when calculating area
Thinking about counting lines instead of area
2. Which of the following Go code snippets correctly declares a slice of heights for the Container With Most Water problem?
easy
A. heights := []int{1, 8, 6, 2, 5, 4, 8, 3, 7}
B. heights := [1, 8, 6, 2, 5, 4, 8, 3, 7]
C. heights := (1, 8, 6, 2, 5, 4, 8, 3, 7)
D. heights := {1, 8, 6, 2, 5, 4, 8, 3, 7}
Solution
Step 1: Recall Go slice declaration syntax
In Go, slices are declared using []type{values}, for example []int{1,2,3}.
Step 2: Check each option
heights := []int{1, 8, 6, 2, 5, 4, 8, 3, 7} uses []int{...} which is correct. Options A, B, C use invalid syntax for slices.
Using parentheses or braces instead of [] for slices
Confusing arrays and slices syntax
Missing type declaration in slice
3. What is the output of the following Go code snippet that implements the Container With Most Water logic?
package main
import "fmt"
func maxArea(height []int) int {
left, right := 0, len(height)-1
maxArea := 0
for left < right {
width := right - left
var h int
if height[left] < height[right] {
h = height[left]
left++
} else {
h = height[right]
right--
}
area := width * h
if area > maxArea {
maxArea = area
}
}
return maxArea
}
func main() {
heights := []int{1,8,6,2,5,4,8,3,7}
fmt.Println(maxArea(heights))
}
medium
A. 49
B. 56
C. 48
D. 64
Solution
Step 1: Understand the two-pointer approach
Start with left=0 and right=8, calculate area and move the pointer with smaller height inward.
Step 2: Trace the iterations
Initial area: min(1,7)*8=8
Move left to 1
Next area: min(8,7)*7=49
Move right to 7
Next area: min(8,3)*6=18
Move right to 6
Next area: min(8,8)*5=40
Move right to 5
Next area: min(8,4)*4=16
Move right to 4
Next area: min(8,5)*3=15
Move right to 3
Next area: min(8,2)*2=4
Move right to 2
Next area: min(8,6)*1=1
Move left to 2
Max area found is 49.
Final Answer:
49 -> Option A
Quick Check:
Max area calculated by two-pointer = 49 [OK]
Hint: Use two pointers moving inward, track max area [OK]
Common Mistakes:
Calculating area with max height instead of min
Not moving the pointer with smaller height
Confusing width calculation
4. Identify the bug in this Go function for Container With Most Water and select the fix:
func maxArea(height []int) int {
left, right := 0, len(height)-1
maxArea := 0
for left <= right {
width := right - left
var h int
if height[left] < height[right] {
h = height[left]
left++
} else {
h = height[right]
right--
}
area := width * h
if area > maxArea {
maxArea = area
}
}
return maxArea
}
medium
A. Use maxArea = area without checking if area > maxArea
B. Initialize maxArea to -1 instead of 0
C. Increment both left and right pointers inside the loop
D. Change loop condition to 'left < right' instead of 'left <= right'
Solution
Step 1: Analyze the loop condition
The loop runs while left <= right, which allows left and right to be equal, causing width to be zero or negative.
Step 2: Fix the loop condition
Changing to left < right ensures width is always positive and valid for area calculation.
Final Answer:
Change loop condition to 'left < right' instead of 'left <= right' -> Option D
Quick Check:
Loop must run while left < right [OK]
Hint: Use strict less than for pointers to avoid zero width [OK]
Common Mistakes:
Using <= instead of < causing invalid area
Updating both pointers at once
Not checking if area is greater before updating maxArea
5. Given the heights slice []int{4, 3, 2, 1, 4}, what is the maximum water container area? Use the two-pointer approach and explain why the maximum area is found at those positions.
hard
A. 12
B. 16
C. 8
D. 6
Solution
Step 1: Initialize pointers and calculate areas
Start with left=0 (height=4), right=4 (height=4), width=4, area=4*4=16.
Step 2: Move pointers and check other areas
Since heights[left] == heights[right], move right pointer left:
Now left=0, right=3 (height=1), width=3, area=min(4,1)*3=3
Move right to 2 (height=2), area= min(4,2)*2=4
Move right to 1 (height=3), area= min(4,3)*1=3
Max area remains 16.
Final Answer:
16 -> Option B
Quick Check:
Max area between positions 0 and 4 = 16 [OK]
Hint: Max area often at widest distance with min height [OK]
Common Mistakes:
Not considering both ends first
Moving wrong pointer when heights are equal
Calculating area incorrectly with wrong width
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.