题目描述:给定 n 个非负整数 a1, a2, ..., an, 每个数代表了坐标中的一个点 (i, ai)。画 n 条垂直线,使得 i 垂直线的两个端点分别为(i, ai)和(i, 0)。找到两条线,使得其与 x 轴共同构成一个容器,以容纳最多水。
样例:给出[1,3,2], 最大的储水面积是2.
根据题意,储水面积是由两个高度的最小值 * 两个高度间的水平距离构成的。描述成代码的语言,就是:
min(heights[left], heights[right]) * (right - left) (1)
其中,heights表示给出的高度值的数组,left和right分别是我们选择的两个高度。
那么,这道题可以这样设计:两个指针分别从数组两端开始向中间遍历,每次按照上面的公式(1)计算面积,这个面积和之前的最大面积比较,保存下较大的那个作为新的最大面积。同时将较低的那个高度,向他的方向移动一位。,再对上面的过程迭代,直到遍历完整个数组,返回此时的最大面积即可。
代码如下:
class Solution:
# @param heights: a list of integers
# @return: an integer
def maxArea(self, heights):
if len(heights) == 0:
return 0
left, right = 0, len(heights) - 1
max_value = min(heights[left], heights[right]) * (right - left)
while left < right:
if heights[left] <= heights[right]:
left += 1
max_value = max(max_value, min(heights[left], heights[right]) * (right - left))
else:
right -= 1
max_value = max(max_value, min(heights[left], heights[right]) * (right - left))
return max_value
# write your code here