LeetCode Container With Most Water Solution
You are given an integer array
height of length
n. There are
n vertical lines drawn such that the two endpoints of the
ith line are
(i, 0) and
Find two lines that together with the x-axis form a container, such that the container contains the most water.
Return the maximum amount of water a container can store.
Notice that you may not slant the container.
height = [1,8,6,2,5,4,8,3,7]
Explanation: The above vertical lines are represented by array
[1,8,6,2,5,4,8,3,7]. In this case, the max area of water (blue section) the container can contain is
height = [1,1]
n == height.length
2 <= n <= 105
0 <= height[i] <= 104
Problem Link: https://leetcode.com/problems/container-with-most-water/
We will implement this question using opposite two-pointers with the following steps.
max_area = 0.
- Perform two pointers selections (steps 3-4) while
left < right.
max_areais the maximum of the current
(right - left) * min(height[left], height[right])
left += 1if
height[left] < height[right], else
right -= 1.
- Return the final
The logic behind this two pointers algorithm is that we start from the two ends and work our way into the middle.
Given two vertical lines, the area of that container is
(right - left) * min(height[left], height[right]).
So the only way we can hold more water when the horizontal distance between two pointers decrease, is to increase the vertical distance
We wish to keep the taller line from
height[left], height[right] and continue searching for another line that's taller than the lower line, which potentially forms a larger container.
1def maxArea(self, height: List[int]) -> int: 2 left, right = 0, len(height) - 1 3 max_area = 0 4 while left < right: 5 max_area = max(max_area, (right - left) * min(height[left], height[right])) 6 if height[left] < height[right]: 7 left += 1 8 else: 9 right -= 1 10 return max_area