题目:11. Container With Most Water
问题描述:https://leetcode.com/problems/container-with-most-water/description/
最容易的n方超时,于是想想怎么降低其实对于横坐标为i和j的两条线段(i初始值为0,j初始值为len(height)-1),其最大容积vmax=min(height[i],height[j])*(j-i)。考虑如下情况:当height[i]<height[j]时,此时容器高度为height[i],下一步如何做?i++还是j--?假设做j--取线段j的左边一条线段,如果此时的height[j]仍大于height[i],由于底变短了高不变因此容积减小;如果此时的height[j]小于height[i],会造成容器的高减小变为height[j]并且底边减小,因此容积减小。于是选择i++,即取线段i的右边一条,此时由于底减少而高度有可能增加会导致容积可能增大。因此O(n)可解决了。
代码:
class Solution(object):
def maxArea(self, height):
"""
:type height: List[int]
:rtype: int
"""
res=0;i=0;j=len(height)-1
while i<j:
res=max(res,min(height[i],height[j])*(j-i))
if height[i]<height[j]:
i+=1
else:
j-=1
return res