5.盛最多水的容器

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

返回容器可以储存的最大水量。

说明:你不能倾斜容器。

示例1:
image

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

示例2:

输入:height = [1,1]
输出:1

提示:

  • n == height.length
  • 2 <= n <= 105
  • 0 <= height[i] <= 104

代码:

class Solution {
    public int maxArea(int[] height) {
        //res用来记录可以储存的最大水量,i记录容器的左边界,j记录容器的右边界
        int res = 0,i = 0,j = height.length-1;
        //只要左边界还小于右边界就不断尝试
        while(i<j){
            //在左右边界确定的情况下,可以储存的最大水量=min(左边界高度,右边界高度)*底边长度
            //更新可以存储的最大水量
            res = Math.max(res,Math.min(height[i],height[j])*(j-i));
            //如果左边界高度小于右边界高度,存在两种移动方式:
            //1.将右边界左移,右边界高度变高,由于左边界高度小于右边界高度,可以储存的最大水量=min(左边界高度,右边界高度)*底边长度=左边界高度*底边长度,由于底边长度缩短,故这种方案可以储存的最大水量一定小于未移动前
            //2.将右边界左移,右边界高度变低,不管左边界高度小于右边界高度还是大于右边界高度,高度都会小于等于未移动前高度,而且底边长度缩短,故这种方案可以储存的最大水量一定小于未移动前
            //故只能尝试将左边界右移
            if(height[i]<height[j])i++;
            //同理,如果左边界高度大于等于右边界高度,只能尝试将右边界左移
            else j--;
        }
        //返回可以储存的最大水量
        return res;
    }
}
posted @ 2025-03-13 19:50  回忆、少年  阅读(9)  评论(0)    收藏  举报