5.盛最多水的容器
给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
说明:你不能倾斜容器。
示例1:

输入:[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;
}
}

浙公网安备 33010602011771号