leetcode #11 Container With Most Water
代码如下:
class Solution: def maxArea(self, height): """ :type height: List[int] :rtype: int """ maxWater=0 i=0 j=len(height)-1 while i<j: maxWater=max(maxWater,(j-i)*min(height[i],height[j])) if height[i]<height[j]: i=i+1 else: j=j-1 return maxWater
解题思路:
我一开始想当然的直接用了两层循环,穷举所有可能性寻找最大值。然后毫无疑问地超时了。于是开始思考时间复杂度更低的算法。之前是从左边开始,固定一端,循环另一端寻找最大值,而这样显然太没效率,因此考虑两端同时移动。而又因为在选定的两条线中,能够决定水容量多少的是较短的一根,所以在初始状态选择最边缘的两根线后,向中间移动时只需要判断两根的长度,保留较长的那根线,然后用一个变量来记录移动过程中所能装下水的最大值。这样移动只能保证在每次移动后,所取到的是接下来更有可能装水容量增加的选择,而通过比较之前记录下的最大值与此次的值,在循环结束时保留下来的就是最大值。