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.
Note: You may not slant the container and n is at least 2.
这题目和博客前面两个leetcode题有点相似。
思想是container能容纳雨水=min(height[j],height[i])*(j-i) 。因此,如果height[i]<height[j], min(height[j],height[i]) = height[i], 对于任意 i<k<j, 不管height[k]是大于还是小于height[i],所得到的容积也绝对比 height[i]*(j-i)要小,所以就可以不用再计算那些k<j的情况。同理,如果height[j]<height[i], min(height[i],height[j]) = height[j]。 对于任意j>k>i,不管height[k]是大于还是小于height[j],所得到的容积也绝对比不上 height[i]*(j-i)。
代码:
class Solution(object):
def maxArea(self, height):
"""
:type height: List[int]
:rtype: int
"""
mx = 0
i = 0
j = len(height)-1
while i<j:
mx = max(mx, (j-i)*min(height[i],height[j]))
if height[i]<height[j]:
i += 1
else:
j -= 1
return mx