11. Container With Most Water
Given n non-negative integers a1, a2, …, an , where each represents a point at coordinate (i, ai). n vertical lines are drawn such that the two endpoints of line i is at (i, ai) and (i, 0). Find two lines, which together with x-axis forms a container, such that the container contains the most water.
Example:
Input: [1,8,6,2,5,4,8,3,7]
Output: 49
Solution
C++
class Solution {
public:
int maxArea(vector<int>& height) {
int n = height.size();
int l = 0, r = n-1, res = 0;
while(l < r) {
res = max(res, min(height[l],height[r])*(r-l));
if(height[l] < height[r]) ++l;
else --r;
}
return res;
}
};
Python
class Solution(object):
def maxArea(self, height):
"""
:type height: List[int]
:rtype: int
"""
a, b = 0, len(height)-1
res = 0
while a < b:
res = max(res, min(height[a],height[b])*(b-a))
if height[a] < height[b]:
a += 1
else:
b -= 1
return res
Explanation
Idea / Proof:
The widest container (using first and last line) is a good candidate, because of its width. Its water level is the height of the smaller one of first and last line.
All other containers are less wide and thus would need a higher water level in order to hold more water.
The smaller one of first and last line doesn’t support a higher water level and can thus be safely removed from further consideration.