Container With Most Water
Problem Statement
Given an array of heights representing vertical lines, find two lines that, together with the x-axis, form a container that holds the most water. This is a medium-level problem solved using two pointers.
Example
Input: height = [1, 8, 6, 2, 5, 4, 8, 3, 7]
Output: 49 (lines at indices 1 and 8 with height 7 and width 7 form area 49)
Code
Java
Python
JavaScript
public class Solution {
public int maxArea(int[] height) {
int left = 0, right = height.length - 1;
int maxWater = 0;
while (left < right) {
int width = right - left;
int minHeight = Math.min(height[left], height[right]);
maxWater = Math.max(maxWater, width * minHeight);
if (height[left] < height[right]) {
left++;
} else {
right--;
}
}
return maxWater;
}
}
def max_area(height):
left, right = 0, len(height) - 1
max_water = 0
while left < right:
width = right - left
min_height = min(height[left], height[right])
max_water = max(max_water, width * min_height)
if height[left] < height[right]:
left += 1
else:
right -= 1
return max_water
# Example usage
print(max_area([1, 8, 6, 2, 5, 4, 8, 3, 7])) # 49
function maxArea(height) {
let left = 0, right = height.length - 1;
let maxWater = 0;
while (left < right) {
let width = right - left;
let minHeight = Math.min(height[left], height[right]);
maxWater = Math.max(maxWater, width * minHeight);
if (height[left] < height[right]) {
left++;
} else {
right--;
}
}
return maxWater;
}
// Example usage
console.log(maxArea([1, 8, 6, 2, 5, 4, 8, 3, 7])); // 49
Explanation
- Use two pointers: left at start, right at end.
- Calculate area as width (distance between pointers) times the minimum height.
- Update max area if current area is larger.
- Move the pointer with the shorter height inward to potentially increase area.
Note
Time complexity is O(n) with a single pass. Space complexity is O(1).
