hello 大家好!今天开写一个新章节,每一天一道算法题。让我们一起来学习算法思维吧!
javascript
function maxArea(height) {
// 初始化最大水量为 0
let maxWater = 0;
// 初始化左指针,指向数组的第一个元素
let left = 0;
// 初始化右指针,指向数组的最后一个元素
let right = height.length - 1;
// 只要左指针小于右指针,就继续循环
while (left < right) {
// 计算当前左右指针所指垂线构成的容器的宽度
const width = right - left;
// 计算当前左右指针所指垂线构成的容器的高度,取两者中的较小值
const currentHeight = Math.min(height[left], height[right]);
// 计算当前容器能容纳的水量
const currentWater = width * currentHeight;
// 更新最大水量
maxWater = Math.max(maxWater, currentWater);
// 如果左指针所指垂线的高度小于右指针所指垂线的高度
if (height[left] < height[right]) {
// 左指针右移一位
left++;
} else {
// 否则,右指针左移一位
right--;
}
}
// 返回最大水量
return maxWater;
}
// 测试示例
const height = [1, 8, 6, 2, 5, 4, 8, 3, 7];
console.log(maxArea(height));
代码解释
整体思路
本题使用双指针法来解决。我们使用两个指针分别指向数组的开头和结尾,通过计算这两个指针所指垂线与 x 轴构成的容器的水量,并不断移动指针来寻找最大水量。由于容器的水量由宽度(两个指针的距离)和高度(两个指针所指垂线高度的较小值)决定,每次移动较短的垂线对应的指针,这样有可能找到更大的水量。
代码步骤分析
初始化变量:
- maxWater:用于记录最大水量,初始化为 0。
- left:左指针,初始指向数组的第一个元素,索引为 0。
- right:右指针,初始指向数组的最后一个元素,索引为 height.length - 1。
双指针遍历:
- 使用 while 循环,只要 left 小于 right 就继续循环。
- 在每次循环中,计算当前容器的宽度 width 为 right - left。
- 计算当前容器的高度 currentHeight 为 height[left] 和 height[right] 中的较小值。
- 计算当前容器能容纳的水量 currentWater 为 width * currentHeight。
- 更新 maxWater 为 maxWater 和 currentWater 中的较大值。 根据 height[left] 和
height[right] 的大小关系移动指针:如果 height[left] 小于 height[right],将 left
指针右移一位;否则,将 right 指针左移一位。
返回结果:
- 当 left 不再小于 right 时,循环结束,返回 maxWater,即最大水量。