问题描述:
给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。画 n 条垂直线,使得垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
注意:你不能倾斜容器,n 至少是2。
问题分析:
题目意思就是让你找出两个直线,与x坐标轴构成一个桶,且让这个桶容纳的水最大。现在分析这个桶的容量和那些因素有关?很显然,和桶的底部的宽度有关、和两条直线中最短的一条有关。所以
(1)以最大桶底开始,设置首尾两个指针left、right。
(2)当height[left] < height[right],left从左向右移动一个位置。
(3)当height[left] >= height[right],right从右向左移动一个位置。
(4)每移动一次,就更新一下,容器的最大的容量,直到结束。
(5)为什么这样做,就可以选择出最大的容器?可以简单的理解,即,桶底,保持最大,我只要选取最长的两个直线,那么我一定可以选择到最大的容器,不太严谨哈,其实可以用反证法证明的。
Python3实现:
# @Time :2018/6/7
# @Author :Yinxing
# 利用双指针的方法
class Solution:
def maxArea(self, height):
left, right, maxarea = 0, len(height)-1, 0 # 初始化双指针
while left < right:
if height[left] < height[right]: # 从左向右移动
tmp = height[left]*(right-left)
left += 1
else:
tmp = height[right] * (right - left) # 从右向左移动
right -= 1
maxarea = tmp if maxarea < tmp else maxarea # 更新最大容量
return maxarea
if __name__ == '__main__':
solu = Solution()
height = [1, 1]
print(solu.maxArea(height))
欢迎指正哦