当前位置: 首页 > news >正文

LeetCode 热题 100 —— 7.接雨水(Javascript解法)

一、题目

给定n个非负整数表示每个宽度为1的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

示例:

输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]

输出:6

解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。

二、解法

解法1:双指针

思路:对于每个位置,能接的水量 =min(左边最大高度, 右边最大高度) - height[i]
我们不需要预先计算每个位置的左右最大值,而是用两个指针从两端向中间移动,同时维护左侧最大值leftMax和右侧最大值rightMax

  • 如果height[left] < height[right],说明左侧的短板决定了当前左侧位置的水量,更新leftMax并计算left处的水量,然后left++

  • 否则,处理右侧。

代码实现:

/** * @param {number[]} height * @return {number} */ var trap = function(height) { if (height.length < 3) return 0; let left = 0, right = height.length - 1; let leftMax = 0, rightMax = 0; let water = 0; while (left < right) { if (height[left] < height[right]) { // 左边较低,处理左指针 if (height[left] >= leftMax) { leftMax = height[left]; } else { water += leftMax - height[left]; } left++; } else { // 右边较低或相等,处理右指针 if (height[right] >= rightMax) { rightMax = height[right]; } else { water += rightMax - height[right]; } right--; } } return water; };
解法2:动态规划

思路:预先计算每个位置左侧最大值和右侧最大值,然后遍历累加。

代码实现:

/** * @param {number[]} height * @return {number} */ var trap = function(height) { const n = height.length; if (n < 3) return 0; const leftMax = new Array(n); const rightMax = new Array(n); leftMax[0] = height[0]; for (let i = 1; i < n; i++) { leftMax[i] = Math.max(leftMax[i-1], height[i]); } rightMax[n-1] = height[n-1]; for (let i = n-2; i >= 0; i--) { rightMax[i] = Math.max(rightMax[i+1], height[i]); } let water = 0; for (let i = 0; i < n; i++) { water += Math.min(leftMax[i], rightMax[i]) - height[i]; } return water; };
解法3:单调栈

思路:维护一个递减栈,遇到比栈顶高的柱子时,弹出栈顶并计算积水。

代码实现:

/** * @param {number[]} height * @return {number} */ var trap = function(height) { const stack = []; let water = 0; for (let i = 0; i < height.length; i++) { while (stack.length && height[i] > height[stack[stack.length - 1]]) { const top = stack.pop(); if (!stack.length) break; const distance = i - stack[stack.length - 1] - 1; const boundedHeight = Math.min(height[i], height[stack[stack.length - 1]]) - height[top]; water += distance * boundedHeight; } stack.push(i); } return water; };

三、其他

三种算法时间复杂度都是O(n).这道题是困难难度,我也只大概理解了第一种算法,逻辑还有些模糊,可以慢慢理解。

http://www.jsqmd.com/news/1099892/

相关文章:

  • 别再盲目试用了!AI编程助手采购决策树:按团队规模、语言栈、安全等级自动匹配最优组合(含SaaS/私有化/混合部署ROI计算表)
  • 2026 年有哪些真正适合学生写开题的 AI 辅助写作工具,实测无套路分享
  • 【VMware磁盘扩容终极指南】:20年运维专家亲授5种零宕机扩容方案,99%的人不知道第3种!
  • Antigravity Manager:把多个 AI 账号管明白的桌面工具
  • Debian 12 编译安装网讯网卡驱动详细教程
  • Dism++深度解析:现代化Windows系统维护架构与技术实现
  • SCI投稿AI绘图避坑全攻略:AI打草稿+人工转矢量,彻底告别撤稿风险!
  • 从H100的异步执行和线程块集群,聊聊如何榨干GPU的每一分算力
  • 2026年技术方向怎么选?机器视觉、PLC、AI大模型、嵌入式深度对比
  • 宝塔面板部署 Spring Boot 项目全流程
  • Python爬虫经典案例018:爬虫性能优化与调优——从慢到快的全面优化指南
  • VisualCppRedist AIO:终极Windows运行库一体化智能管理解决方案深度解析
  • 【open harmony/harmonyos】HarmonyOS 应用中的数据模型分层:以星图节点 Store 为例
  • 2026年论文查重免费网站靠谱吗?这5个平台实测对比
  • 基于STM32单片机智能窗帘窗户光敏定时遥控温湿度语音物联网设计1(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_
  • 09502黄大年茶思屋榜文95期 第2题 高性能、适用于NPU硬件的Training-free大模型剪枝算法
  • openGauss 还原成功了,用户却喊“数据库里啥也没有“:一个 search_path 坑实录
  • 国家标准起草单位是什么?有什么价值?企业如何申请参与国标制定
  • Claude Code 深度实战指南:从环境配置到 Agent 自动化进阶
  • 开源AI绘画工作台infinite-canvas:本地部署与高效工作流构建指南
  • SIM 卡克隆工具指南:安全移动 SIM 卡数据
  • 上门按摩APP小程序开发公司,获客新思路:酒店渠道为什么值得做
  • 如何在一部手机上实现工作与生活数据的完全隔离?
  • 如何快速构建轻量级多模态AI:3步实现模型融合的终极指南
  • 一键提取爆款短视频文案,批量采集竞品素材
  • Linux生产环境硬盘挂载:为何必须用UUID替代设备名?
  • API受限下15种LLM幻觉抑制创新方法
  • 如何利用多人协作在线表格提升团队效率?告别协作混乱与数据勒索
  • Unreal Engine 5.7 C++ 完整说明(C++ 标准、内置库、第三方库、内存 GC)
  • 微信好友上限是多少?为什么不建议好友加满?