11. 盛最多水的容器

2021-12-23 18:43:04 浏览数 (1)

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

思路:

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

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

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

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

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

总结:

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

代码:

代码语言:javascript复制
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;
    }

0 人点赞