美文网首页
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