LeetCode:11. Container With Most Water - Python

问题描述:

给定 n 个非负整数 a1a2,...,an,每个数代表坐标中的一个点 (iai) 。画 n 条垂直线,使得垂直线 i 的两个端点分别为 (iai) 和 (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))
欢迎指正哦

猜你喜欢

转载自blog.csdn.net/xx_123_1_rj/article/details/81040184