D

当前:LC11 · 盛最多水的容器 · 首次出现于 Day 4 · 路径:顶栏「56天打卡」→ 点击 LC 题号 → 逐题动画

LC11

盛最多水的容器

短板决定水位,移动短板才有机会变大

给定高度数组,选两根竖线与 x 轴围成容器,求最大水量。 核心公式 area = min(height[L], height[R]) × (R − L)——水面高度由短板决定,不是高板。

固定输入 height
186254837
最优答案 49(下标 1 8
左右双指针贪心淘汰时间 O(n)空间 O(1)
1/26开场
3D 水库 · 港口闸门min(1,7) × 8 =
1
L
0
8
1
6
2
2
3
5
4
4
5
8
6
3
7
7
R
8

水面高度由短板决定;面积区域为半透明蓝填充。移动指针前先播放淘汰证明,再执行 L++ 或 R--。

maxArea
0

状态面板

L
0
R
8
height[L]
1
height[R]
7
width
8
shortWall
1
currentArea
0
maxArea
0

左右双指针落在数组两端:初始宽度 (R-L) 最大。面积公式 area = min(height[L], height[R]) × (R-L)——水面高度由短板决定,不是高板。

为什么安全:从两端出发先占住最大宽度,再逐步移动短板寻找更高水位,这是贪心淘汰而非排序技巧。

淘汰矩阵 · 配对 (i, j) 且 i < j

未检查当前已淘汰最优
j=0j=1j=2j=3j=4j=5j=6j=7j=8
i=0
i=1
i=2
i=3
i=4
i=5
i=6
i=7
i=8

每个格子是一对下标 (i,j)。灰色 = 已被证明不可能更优;金色 = 当前已知最优; 青色 = 双指针正在考察的组合。

正确性解释

  1. 1.从两端出发:初始宽度 (R−L) 最大,先覆盖最宽的一批组合。
  2. 2.面积 = min(height[L], height[R]) × (R−L):水位由短板决定,高板再多水也溢不出。
  3. 3.宽度每一步都会减少:R−L 单调变小,不可能靠「变宽」翻盘。
  4. 4.若移动高板:短板高度不变、宽度变小 → 面积不可能更大。
  5. 5.因此固定短板的一整批组合可安全淘汰;只有移动短板才有机会遇到更高水位。
  6. 6.每对 (i,j) 最多被考察一次,共 O(n) 步;指针只有两个,空间 O(1)。
Go 代码 · 步骤同步
1func maxArea(height []int) int {
2 l, r := 0, len(height)-1
3 ans := 0
4
5 for l < r {
6 h := min(height[l], height[r])
7 area := h * (r - l)
8 ans = max(ans, area)
9
10 if height[l] < height[r] {
11 l++
12 } else {
13 r--
14 }
15 }
16
17 return ans
18}

面试版答案

面积 = 短板高 × 宽度。 双指针从两端出发(初始宽度最大),每次计算当前面积并更新 ans。

移动较矮一侧(或等高时固定移右):移动高板只会让宽度减小而短板不变,面积不可能更大; 因此以当前短板为固定端的一整批组合可安全淘汰。

移动短板不会漏掉最优解。时间 O(n),空间 O(1)。

人话解释
  • 水能装多高,不看高板,看短板
  • 宽度只会越来越小
  • 想让面积变大,唯一机会是换掉短板
  • 所以每次移动短板

常见误区

  • 误区 1移动高板也许能找到更高的板
    纠正:当前短板没变,宽度还变小,不可能更优。
  • 误区 2数组没排序,双指针为什么能用
    纠正:这里不是利用排序,而是利用「宽度单调减少 + 短板限制面积」的淘汰条件。
  • 误区 3相等高度怎么办
    纠正:移动任意一边都可以,本实现固定移动右边,保证动画稳定。

步骤时间线