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 = —
10
L
8
1
6
2
2
3
5
4
4
5
8
6
3
7
78
R
水面高度由短板决定;面积区域为半透明蓝填充。移动指针前先播放淘汰证明,再执行 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=0 | j=1 | j=2 | j=3 | j=4 | j=5 | j=6 | j=7 | j=8 | |
|---|---|---|---|---|---|---|---|---|---|
| i=0 | |||||||||
| i=1 | |||||||||
| i=2 | |||||||||
| i=3 | |||||||||
| i=4 | |||||||||
| i=5 | |||||||||
| i=6 | |||||||||
| i=7 | |||||||||
| i=8 |
每个格子是一对下标 (i,j)。灰色 = 已被证明不可能更优;金色 = 当前已知最优; 青色 = 双指针正在考察的组合。
正确性解释
- 1.从两端出发:初始宽度 (R−L) 最大,先覆盖最宽的一批组合。
- 2.面积 = min(height[L], height[R]) × (R−L):水位由短板决定,高板再多水也溢不出。
- 3.宽度每一步都会减少:R−L 单调变小,不可能靠「变宽」翻盘。
- 4.若移动高板:短板高度不变、宽度变小 → 面积不可能更大。
- 5.因此固定短板的一整批组合可安全淘汰;只有移动短板才有机会遇到更高水位。
- 6.每对 (i,j) 最多被考察一次,共 O(n) 步;指针只有两个,空间 O(1)。
Go 代码 · 步骤同步
1func maxArea(height []int) int {2 l, r := 0, len(height)-13 ans := 045 for l < r {6 h := min(height[l], height[r])7 area := h * (r - l)8 ans = max(ans, area)910 if height[l] < height[r] {11 l++12 } else {13 r--14 }15 }1617 return ans18}
面试版答案
面积 = 短板高 × 宽度。 双指针从两端出发(初始宽度最大),每次计算当前面积并更新 ans。
移动较矮一侧(或等高时固定移右):移动高板只会让宽度减小而短板不变,面积不可能更大; 因此以当前短板为固定端的一整批组合可安全淘汰。
移动短板不会漏掉最优解。时间 O(n),空间 O(1)。
人话解释
- 水能装多高,不看高板,看短板
- 宽度只会越来越小
- 想让面积变大,唯一机会是换掉短板
- 所以每次移动短板
常见误区
- 误区 1:移动高板也许能找到更高的板纠正:当前短板没变,宽度还变小,不可能更优。
- 误区 2:数组没排序,双指针为什么能用纠正:这里不是利用排序,而是利用「宽度单调减少 + 短板限制面积」的淘汰条件。
- 误区 3:相等高度怎么办纠正:移动任意一边都可以,本实现固定移动右边,保证动画稳定。