11_盛最多水的容器[MEDIUM]
约 389 字大约 1 分钟
2026-03-09
给定一个长度为 n 的整数数组 height 。
有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。

示例:
输入:[1,8,6,2,5,4,8,3,7]
输出:49
解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。
在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。解题思路
双指针,初始时一个在左(left),一个在右(right),只要 left 和 right 中间还有空间,就一直往中间收缩。
- 长 =
height[right] - height[left] - 宽 =
min(height[right], height[left]) - 面积 = 长 × 宽
关键点:哪边的线短,就移动哪边的指针。
原因:如果我们移动较长的那根线,矩形的宽度会减小,而高度依然受限于那根较短的线,所以面积只会变小。只有移动较短的那根线,我们才有可能遇到一根更长的线,从而在宽度减小的情况下,通过增加高度来获得更大的面积。
3. Java 实现
class Solution {
public int maxArea(int[] height) {
// 长、宽、面积
int l = 0, w = 0, area = 0;
int left = 0, right = height.length - 1;
while (left != right){
l = right - left;
w = height[left] > height[right] ? height[right] : height[left];
if (l * w > area){
area = l * w;
}
if (height[left] > height[right]){
right--;
} else {
left++;
}
}
return area;
}
}