原题
双指针与滑动窗口中等1 种解法

#11盛最多水的容器

选择两条竖线,使它们与横轴围成的容器面积最大。

#数组#双指针#贪心

原题

给定一个长度为 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

查看原题

解题主线

  1. 面积由较短边决定;移动较长边只会缩小宽度且不能提高高度上限。
  2. 因此每轮计算面积后移动较短边,不会遗漏可能更优的答案。

解法 1:首尾双指针

从最大宽度开始,记录当前面积并向内移动较短的一侧。

  • 时间复杂度: O(n)

  • 空间复杂度: O(1)

JAVA
final class Solution {
    public int maxArea(int[] height) {
        int left = 0;
        int right = height.length - 1;
        int answer = 0;
        while (left < right) {
            // 面积上限由较短边决定。
            int area = Math.min(height[left], height[right]) * (right - left);
            answer = Math.max(answer, area);
            // 移动较长边只会缩小宽度,唯有移动短边才可能提高高度上限。
            if (height[left] <= height[right]) left++;
            else right--;
        }
        return answer;
    }
}

边界与易错点

  • 宽度是下标差,不是元素个数。
  • 输入规模扩大时面积乘法可能需要 long;本题约束内 int 足够。

整理来源

由旧仓库源码复核、去重并整理;展示代码已按 Java 21 语义修正明显问题。

  • medium/Q011_mostWaterContainer.java