11.盛最多水的容器
给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器。
示例 1:

1 | 输入:[1,8,6,2,5,4,8,3,7] |
示例 2:
1 | 输入:height = [1,1] |
示例 3:
1 | 输入:height = [4,3,2,1,4] |
示例 4:
1 | 输入:height = [1,2,1] |
解题思路
这是一道经典的双指针题目,也是面试中的高频考点。
核心思想
- 使用双指针从两端向中间移动
- 每次移动高度较小的指针
- 记录过程中遇到的最大面积
为什么这样做是正确的?
- 面积计算:面积 = 宽度 × 高度 = (right - left) × min(height[left], height[right])
- 移动策略:总是移动高度较小的指针
- 正确性证明:移动高度较大的指针不会得到更大的面积
方法一:双指针解法(推荐)
时间复杂度 O(n)、空间复杂度 O(1)
1 | /** |
方法二:优化版本
1 | var maxArea = function(height) { |
方法三:暴力解法(不推荐)
时间复杂度 O(n²)、空间复杂度 O(1)
1 | var maxArea = function(height) { |
解题要点
- 双指针技巧:这是双指针的经典应用
- 移动策略:总是移动高度较小的指针
- 面积计算:面积 = 宽度 × 最小高度
- 优化思路:避免暴力枚举,使用双指针优化
面试要点
- 高频考点:这道题是面试中的高频题目
- 算法思维:考察双指针的应用
- 时间复杂度:能够分析时间复杂度和空间复杂度
- 代码简洁性:面试中要写出简洁清晰的代码
相关题目
- 42.接雨水 - 困难版本,类似的双指针应用
- 15.三数之和 - 双指针的另一种应用
- 167.两数之和 II - 输入有序数组 - 双指针基础
扩展思考
为什么移动高度较小的指针是正确的?
- 因为当前面积受限于较小的高度
- 移动较大高度的指针不会增加面积
能否使用其他方法?
- 暴力解法:O(n²) 时间复杂度
- 分治法:可以但复杂度较高
- 双指针是最优解法
边界情况处理
- 数组长度为2的情况
- 所有高度相等的情况
- 高度为0的情况
最后更新: 2021-09-03