11. 盛最多水的容器
思路
要解决容器盛水问题,核心是最大化底边长度与最小高度的乘积。使用双指针策略:
- 双指针初始化:左指针在数组起始位置,右指针在数组末尾
- 指针移动规则:每次移动高度较小的指针(因为容器高度由较小值决定)
- 面积计算:当前面积 = 指针距离 × 较小高度
- 更新最大面积:遍历过程中记录最大面积
复杂度分析
- 时间复杂度:O(n)
双指针遍历整个数组一次 - 空间复杂度:O(1)
仅使用常数级额外空间
代码
class Solution {
public int maxArea(int[] height) {
int left = 0;
int right = height.length - 1;
int maxArea = 0;
while (left < right) {
// 计算当前容器面积
int h = Math.min(height[left], height[right]);
int w = right - left;
maxArea = Math.max(maxArea, h * w);
// 移动高度较小的指针(高度相等时移动任意一个)
if (height[left] < height[right]) {
left++;
} else {
// 当height[left] >= height[right]时(包含相等情况)
right--;
}
}
return maxArea;
}
}
height[left] = height[right]时,随便一次移动都不会错过最大面积,情况如下:
- 当前是最大面积,不会错过
- 当前不是最大面积,随着遍历的进行,长度是减小的,那么中间肯定有至少两条更高的垂线,不管先移动哪侧的指针,最终都会有一侧先遍历到更高的垂线,等待另一次移动到更高的垂线计算出最大面积

浙公网安备 33010602011771号