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

数据结构与算法-算法-42. 接雨水

题目:

42. 接雨水 - 力扣(LeetCode)42. 接雨水 - 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 1:[https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2018/10/22/rainwatertrap.png]输入: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 个单位的雨水(蓝色部分表示雨水)。 示例 2:输入:height = [4,2,0,3,2,5]输出:9 提示: * n == height.length * 1 <= n <= 2 * 104 * 0 <= height[i] <= 105https://leetcode.cn/problems/trapping-rain-water/description/?envType=study-plan-v2&envId=top-100-liked总结:
利用一个单调栈,一旦触发弹栈就能放雨水。但是要注意边界问题。
宽度如和计算。雨水的高度如和计算。

代码示例:

/*** <h3>接雨水 - 单调栈</h3>*/
public class TrappingRainWaterLeetcode42 {public static void main(String[] args) {System.out.println(trap(new int[]{0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1})); // 6//System.out.println(trap2(new int[]{4, 2,  9, 3, 2, 5})); // 9}static int trap(int[] heights){LinkedList<Data> stack = new LinkedList<>();int sums = 0;for (int i = 0; i < heights.length; i++) {Data rights = new Data(heights[i], i);//右边界//要保证栈不为空。为了单调性,栈顶的高度比 右边界的小。才入栈while(!stack.isEmpty() && stack.peek().height < rights.height){Data pop = stack.pop();//弹出的Data left = stack.peek();//现在的栈顶if(left != null){//不是最左边界才能放//只要触发弹栈。就标明有位置放雨水//宽度计算,right 的索引减去 left 的索引-1。比如:3,1.3-1=2-1=1宽度是 1int width = rights.i - left.i - 1;
//高度计算int height = Math.min(left.height, rights.height) - pop.height;sums += width * height;}}stack.push(rights);}return sums;}static class Data{int height;int i;  // 索引public Data(int height, int i) {this.height = height;this.i = i;}@Overridepublic String toString() {return String.valueOf(height);}}
}

视频讲解:
进阶数据结构和算法-336-接雨水-Leetcode42_哔哩哔哩_bilibili进阶数据结构和算法-336-接雨水-Leetcode42是大厂必备数据结构与算法Java视频教程(下篇),java高级程序员必学的数据结构与算法的第182集视频,该合集共计200集,视频收藏或关注UP主,及时了解更多相关视频内容。https://www.bilibili.com/video/BV1rv4y1H7o6?spm_id_from=333.788.videopod.episodes&vd_source=359511ad49b33d059c0e1fac0e8145e4&p=182

http://www.dtcms.com/a/355631.html

相关文章:

  • AI 如何 “看见” 世界?计算机视觉(CV)的核心技术:图像识别、目标检测与语义分割
  • Scrapy 框架实战:构建高效的快看漫画分布式爬虫
  • 试验铁地板在现代工业中的应用与特性
  • AI医疗影像诊断新突破:从肺部CT结节识别到眼底病变筛查,提升疾病早诊效率
  • MTK Linux DRM分析(十四)- Mediatek KMS实现mtk_drm_drv.c(Part.2)
  • 工业机器人如何通过Modbus TCP转CanOpen网关高效通信!
  • 机器学习基本介绍
  • 【练习九】Java实现加油站支付小程序:存款与消费
  • 健永科技RFID技术在高压电厂机器狗巡检中的应用
  • Access token(访问令牌:以JWT格式无状态存储)和Refresh token(刷新令牌:有状态存储于Redis/DB)区别与联系、Redis黑名单
  • C#-mqtt通讯,服务端和客户端,以及esp32-mqtt
  • 第二十节:3D文本渲染 - 字体几何体生成与特效
  • 神经网络 | 基于matlab的LSTM详解
  • 3D高斯溅射实现医疗影像内部场景渲染
  • 【论文阅读】Object Detection in Adverse Weather for Autonomous Driving through Data Merging and YOLOv8
  • ConceptGraphs: Open-Vocabulary 3D Scene Graphs for Perception and Planning
  • 第八章:《性能优化技巧》——深入讲解预分配容量、移动语义、避免频繁拼接等优化策略,以及C++17的`string_view`如何减少拷贝开
  • 三电平逆变器SVPWM控制(无解耦功能)与谐波分析
  • gpt-5生成圆柱blockmesh脚本
  • UDS NRC24
  • 修改win11任务栏时间字体和小图标颜色
  • Graphpad Prism Mac医学绘图工具
  • GraphRAG技术深度解析:重新定义智能问答的未来
  • 数据结构初阶:详解顺序表OJ题
  • CUDA 矩阵分块乘法
  • Rust Web开发指南 第六章(动态网页模板技术-MiniJinja速成教程)
  • Docker 核心技术:Union File System
  • 知微集:梯度下降详解
  • 编写TreeMap自定义排序的插曲
  • 信号量使用流程