盛水最多的容器

题目:给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器,且 n 的值至少为 2。
来源:https://leetcode-cn.com/problems/container-with-most-water/

法一:双指针法

思路:由于是求最大的存水面积,易知影响存水面积S的只有两个变量即容器的宽和高,故可以遍历所有的宽和高,但这样算法较为复杂,可以先把宽设为最大,即将指针指向两端,再逐步移动指针使宽减小,每次移动均移动高较小的那个。

class Solution:
    def maxArea(self, height) -> int:

        i, j, res = 0, len(height) - 1, 0
        while i < j:
            if height[i] < height[j]:
                res = max(res, height[i] * (j - i))
                i += 1
            else:
                res = max(res, height[j] * (j - i))

        j -= 1
        return res

if __name__ == '__main__':
    duixiang = Solution()

    ww = duixiang.maxArea([1,8,6,2,5,4,8,3,7])
    print('结果是:', ww)
View Code

 

posted on 2019-08-20 11:43  吃我一枪  阅读(144)  评论(0编辑  收藏  举报

导航