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

11. 盛最多水的容器

作者: 名字是乱打的 | 来源:发表于2021-06-24 23:59 被阅读0次

    leetcode有一点好,不用写很多空值判断啥玩意的,这里n值和高度都是有效值,只考虑我们的思路就好了。

    思路:

    双指针法,每次保留较大值,知道左右边界相交判断完全部的值!

    首先定义俩指针分别指向最左和最右的那个柱子。那么水的宽度是两根柱子之间的距离 d = 8d=8;水的高度取决于两根柱子之间较短的那个,即左边柱子的高度 h = 3h=3。水的面积就是 3 * 8 =24。

    那么如果选择固定一根柱子,另外一根变化,水的面积会有什么变化吗?稍加思考可得:

    • 当前柱子是最两侧的柱子,水的宽度 dd 为最大,其他的组合,水的宽度都比这个小。
    • 左边柱子较短,决定了水的高度为 3。如果移动左边的柱子,新的水面高度不确定,一定不会超过右边的柱子高度 7。
    • 如果移动右边的柱子,新的水面高度一定不会超过左边的柱子高度 3,也就是不会超过现在的水面高度。

    因此我们可以发现,我们知道较短的一根柱子固定后,长柱向内移动必然会使值更小,因此我们可以丢弃短柱,去探索长柱留下的情况下有没有最大值。

    总结:

    这里思路其实不是去一下子找到什么最大值,而是每次排除不可能产生最大值的情况,留下可能产生最大值的区域。

    代码:

    public int maxArea(int[] height) {
            int left=0,right=height.length-1;
            int res=0;
            while (left<right){
                int s=(Math.min(height[left],height[right]))*(right-left);
                res=Math.max(res,s);
                if (height[left]<height[right]){
                    left++;
                }else {
                    right--;
                }
            }
            return res;
        }
    

    相关文章

      网友评论

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

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