美文网首页
11. 盛最多水的容器

11. 盛最多水的容器

作者: 周英杰Anita | 来源:发表于2020-06-29 16:03 被阅读0次

给你 n 个非负整数 a1a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

说明:你不能倾斜容器,且 n 的值至少为 2。

image

图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。

示例:

输入:[1,8,6,2,5,4,8,3,7]
输出:49

思路--双指针法

左右指针分别指向数组的左右两端
它们可以容纳的水量=两个指针指向的数字中较小值∗指针之间的距离
此时我们需要移动一个指针。移动哪一个呢?
通过上面水的容量计算公式可以看出:
1、无论左移还是右移指针,指针之间的距离都是越来越小的;所以主要看如何移动指针指向的数字。
2、如果我们移动数字较大的那个指针,那么前者「两个指针指向的数字中较小值」不会增加,后者「指针之间的距离」会减小,那么这个乘积会减小。因此,我们移动数字较大的那个指针是不合理的。因此,我们移动 数字较小的那个指针。

参考解法链接:https://leetcode-cn.com/problems/container-with-most-water/solution/sheng-zui-duo-shui-de-rong-qi-by-leetcode-solution/

python3解法--双指针法

class Solution:
    def maxArea(self, height: List[int]) -> int:
        if not height or len(height) < 2:
            return 0
        left, right = 0, len(height) - 1
        ans = 0
        while left < right:
            ans = max(ans, (right - left) * min(height[right], height[left]))
            if height[right] < height[left]:
                right -= 1
            else:
                left += 1
        return ans

python3解法--暴力解法

class Solution:
    def maxArea(self, height: List[int]) -> int:
        ans = 0
        for i in range(0, len(height) - 1):
            for j in range(i + 1, len(height)):
                ans = max(ans, (j - i) * min(height[j], height[i]))
        return ans

相关文章

网友评论

      本文标题:11. 盛最多水的容器

      本文链接:https://www.haomeiwen.com/subject/qfzofktx.html