水最多的容器

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

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

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

//思路:对撞指针
//假设有左指针和右指针,且左指针指向的值小于右指针的值。
//假如我们将右指针左移,则右指针左移后的值和左指针指向的值相比有三种情况:
//(1)右指针指向的值大于左指针:这种情况下,容器的高取决于左指针,但是底变短了,所以容器盛水量一定变小
//(2)右指针指向的值等于左指针:这种情况下,容器的高取决于左指针,但是底变短了,所以容器盛水量一定变小
//(3)右指针指向的值小于左指针:这种情况下,容器的高取决于右指针,但是右指针小于左指针,且底也变短了,所以容量盛水量一定变小了
// 反之,情况类似。
// 综上所述,容器高度较大的一侧的移动只会造成容器盛水量减小。
// 所以应当移动高度较小一侧的指针,并继续遍历,直至两指针相遇。
class Solution {
    public int maxArea(int[] height) {
        if(height.length<=1){
            return 0;
        }
        int l = 0;
        int r = height.length-1;

        int max = 0;
        while(l<r){
            //如何判断判断时想左以,还是向右移
            int tmp = (r-l)*Math.min(height[l],height[r]);
            if(tmp > max){
                max = tmp;
            }
            if(height[l]<height[r]){
                l++;
            }else{
                r--;
            }
        }
        return max;
    }
}

参考:

posted @ 2024-02-03 23:16  行行行行星  阅读(36)  评论(0)    收藏  举报