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

leetcode42-接雨水

leetcode 42
在这里插入图片描述

思路

本题使用 单调栈 来计算每个位置能够接住的雨水量

理解问题

题目要求计算一系列柱子之间可以接住的雨水量。输入是一个数组,每个元素代表柱子的高度。输出是一个整数,表示能够接住的水量。

找到边界条件
  • 什么情况下可以接住雨水,水量的计算依赖于柱子两边的高度,即左边界和右边界的高度
  • 确定两边高度后,能够接住的水量 由较低的边界决定
设想解决方案

考虑到要计算每一段之间的水量,可以考虑以下几种方案:

  • 暴力法:对于每一个柱子,遍历找到它左边和右边的最高柱子的高度,计算水量。这个方案复杂度较高(O(n2)),在处理大数据时会变得非常慢
  • 预处理法:可以使用两个数组存储左边和右边每个柱子的最大高度。这种方法的复杂度为 O(n) 时间和 O(n) 空间。但这并不算最优
优化思路

我们可以利用堆栈的应用,来高效的找到边界并计算水量,单调栈就可以巧妙解决此题

  • 单调栈:栈中的柱子会按高度递增。每当遇到比栈顶高的柱子时,就可以弹出栈顶元素计算水量
实现细节

从左到右遍历数组height,每当遇到更高的柱子时,就开始计算水量

  • 弹出栈顶元素,计算当前柱子与新栈顶之间的水量
  • 使用 Math.min 函数确定雨水高度,并计算当前的水量

实现

var trap = function (height) {const len = height.length;// 单调栈const stack = [0];let result = 0;for (let i = 1; i < len; i++) {while (stack.length && height[i] > height[stack[stack.length - 1]]) {const index = stack.pop();if (stack.length) {const diffHeight = Math.min(height[i], height[stack[stack.length - 1]]) - height[index];result += diffHeight * (i - stack[stack.length - 1] - 1)}}stack.push(i);}return result;
};

相关文章:

  • 深入浅出循环神经网络(RNN):原理、应用与实战
  • Microsoft 365 Copilot应用4月重大更新:正式支持个人版,开启AI办公新时代!
  • 怎么做好质量管理?质量管理怎么做到高效又保质?
  • CKESC Breeze 50A FOC 电调技术解析:矢量控制赋能高效动力系统
  • 信创系统图形界面开发指南:技术选择与实践详解
  • 模式识别的基本概念与理论体系
  • LeetCode 2302.统计得分小于 K 的子数组数目:滑动窗口(不需要前缀和)
  • 【Linux】记录一个有用PS1
  • Transformer:颠覆深度学习的架构革命与技术演进
  • javaScript——正则表达式(四)
  • 从实列中学习linux shell4: shell 脚本中 $0 $1 $2 $3 >> 以及 awk 都是干啥的?
  • 国内免费连接claude-3-7大模型操作教程
  • CSS常用属性_(进阶)
  • CSS:选择器-复合选择器
  • git分支分叉强制更改为线性
  • 为Mac用户定制的云服务器Vultr 保姆级教程
  • 关于安卓自动化打包docker+jenkins实现
  • DeepSeek V2:引入MLA机制与指令对齐
  • 音视频项目在微服务领域的趋势场景题深度解析
  • Dify Agent节点的信息收集策略示例
  • 拍摄《我们这一代》的肖全开展“江浙沪叙事”
  • 强制性国家标准《危险化学品企业安全生产标准化通用规范》发布
  • 国台办:“台独”是绝路,外人靠不住
  • 朝鲜新型驱逐舰“崔贤”号进行多项武器试验
  • 青海省林业和草原局副局长旦增主动投案,正接受审查调查
  • 财政部农业农村司司长吴奇修接受纪律审查和监察调查