题目如下:
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.
Note: You may not slant the container and n is at least 2.
代码如下:
class Solution: def maxArea(self, height): """ :type height: List[int] :rtype: int """ l=len(height) maxare=min(height[0],height[-1])*(l-1) left=0 right=l-1 while(left<right): if(height[left]>height[right]): right=right-1 else: left=left+1 maxare=max(maxare,(min(height[left],height[right])*(right-left))) return maxare
分析如下:
因为容器的容量是由挡板的最短长度和底的宽度来决定的,所以
一开始先选择最左和最右的两个挡板,此时的底长是最长的,
再比较两边挡板的大小,选择一边往中间收一格,若是较大的那块板移动,
则容器的容量只会变得更小或者不变(因为高度已经被较小那块板限死,而底宽一定变小)
所以每一次都选择移动左右板中比较小的那一块,没移动一次就获得一个容量值,
用一个max变量来记录出现的容量值中的最大值,
重复此操作,直到左板和右板相碰,即得到了容量的最大值。
结果如下: