一.问题描述
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.
二.代码编写
暴力解法(即两层循环)在list较大的情况下会TLE,对本题的优化必须舍弃不必要的计算避免TLE。
算法思想:当木桶的宽度缩小时,必须增加高度才能获得更大的木桶容量。也就是说当宽度缩小,而高度未增高的情况是不必要考虑的。所以我们从两端开始往中间寻找,这就涉及到另一个问题,移动两端的哪一条垂直线呢?设想一下,如果移动的是两根中较长的那根,那么容量必然不会增加(因为宽度在减小,同时最高高度不会超过较短的那根)。因为往中间移动时,我们应当移动较短的那根。
具体代码如下:
class Solution(object):
def maxArea(self, height):
"""
:type height: List[int]
:rtype: int
"""
#solutionA: with time complexity of O(N^2) -->TLE
#solutionB: with time complexity of O(N)
i=0
j=len(height)-1
max_con=min(height[i],height[j])*(j-i)
while i<j:
#移动高度较短的那根
if height[i]<height[j]:
hei=height[i]
i+=1
while i<j and height[i]<hei:
i +=1
con=min(height[i],height[j])*(j-i)
if con>max_con:
max_con=con
else:
hei=height[j]
j-=1
while j>i and height[j]<hei:
j -=1
con=min(height[i],height[j])*(j-i)
if con>max_con:
max_con=con
return max_con