盛最多水的容器
🌊 问题描述
给定长度为 n
的整数数组 height
,数组中每个元素代表一条垂线的高度。第 i
条垂线的端点为 (i, 0)
和 (i, height[i])
。
目标:找到两条垂线,使其与 x 轴围成的容器盛水量最大,返回最大水量。
限制条件:容器不能倾斜。
📌 示例解析
示例 1:
- 输入:
[1, 8, 6, 2, 5, 4, 8, 3, 7]
- 输出:
49
- 解释:最大盛水量由高度为
8
和7
的垂线围成(间距为7
),水量为min(8,7) × 7 = 49
。
示例 2:
- 输入:
[1, 1]
- 输出:
1
🧠 解题思路(双指针法)
- 核心逻辑:盛水量由「较短垂线的高度」和「两垂线间距」共同决定,即
水量 = min(左高度, 右高度) × 间距
。 - 指针初始化:左指针
left
指向数组起始,右指针right
指向数组末尾。 - 移动策略:
- 每次计算当前指针围成的水量,并更新最大值。
- 移动「较短的垂线指针」(因为移动较长指针无法增加水量,只会减小间距)。
- 终止条件:左右指针相遇时结束。
💻 代码实现
/**
* @param {number[]} height
* @return {number}
*/
var maxArea = function(height) {
let n = height.length
if (n < 2) return 0;
let i = 0, j = n-1;
let res = []
while(j> i) {
// 计算当前水量
res.push(Math.min(height[i], height[j]) * (j -i))
if(height[i] < height[j]) {
i++
} else {
j--
}
}
return Math.max(...res)
};
📊 复杂度分析
- 时间复杂度:O(n),仅需一次遍历数组。
- 空间复杂度:O(1),仅使用常数级额外空间。
🌟 关键优化点
- 直接维护最大水量,避免存储所有中间结果,空间复杂度从 O(n) 优化至 O(1)。
- 移动指针时,始终选择较短的一侧,确保每次迭代都可能找到更大的水量。