盛水最多的容器

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 为 heightleft 和 heightright 中的较小值。
  • 计算当前容器能容纳的水量 currentWater 为 width * currentHeight。
  • 更新 maxWater 为 maxWater 和 currentWater 中的较大值。 根据 heightleft
    heightright 的大小关系移动指针:如果 heightleft 小于 heightright,将 left
    指针右移一位;否则,将 right 指针左移一位。

返回结果:

  • 当 left 不再小于 right 时,循环结束,返回 maxWater,即最大水量。
相关推荐
不一样的故事1268 分钟前
军工行业合规与基础认知
数据结构·经验分享·算法
xexpertS1 小时前
队列积压治理:如何避免异步系统出现难以恢复的消息积压
java·开发语言
万少6 小时前
用腻了 WorkBuddy 的默认界面?这个开源小工具给它换上了毛玻璃
前端·javascript·后端
To_OC7 小时前
LC 15 三数之和:双指针不难,难的是把去重做对
javascript·算法·leetcode
触底反弹8 小时前
🔥 前端也能玩转 AI 流式输出!从二进制流到打字机效果,一篇讲透
javascript·人工智能·node.js
胡萝卜术8 小时前
深度重构:Agent Skills——从 Prompt 工程到能力工程
javascript·架构·github
benchmark_cc9 小时前
如何用 Python + QuantDash 快速构建高胜率“配对交易(Pairs Trading)”策略?
开发语言·人工智能·python·pandas·量化交易·quantdash
renhongxia110 小时前
世界模型,是“空中楼阁”还是AGI的“最后一块拼图”?
运维·服务器·数据库·人工智能·算法·agi
程序员无隅10 小时前
Coding Agent 为什么压缩上下文后还能继续工作?上下文模块设计拆解
java·开发语言·数据库
Python+9910 小时前
Java 枚举类(Enum)详解:从基础到高级应用
java·开发语言·python