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

04 接雨水 单调栈

42. 接雨水

困难

相关标签

premium lock icon相关企业

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

示例 1:

img

输入: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] <= 105

class Solution {  //暴力解法:拿大部分分数
public:int trap(vector<int>& height) {int sum = 0;for (int i = 0; i < height.size(); i++) {// 第一个柱子和最后一个柱子不接雨水if (i == 0 || i == height.size() - 1) continue;int rHeight = height[i]; // 记录右边柱子的最高高度int lHeight = height[i]; // 记录左边柱子的最高高度for (int r = i + 1; r < height.size(); r++) {if (height[r] > rHeight) rHeight = height[r];}for (int l = i - 1; l >= 0; l--) {if (height[l] > lHeight) lHeight = height[l];}int h = min(lHeight, rHeight) - height[i];if (h > 0) sum += h;}return sum;}
};
  • 纵向求解,第一个柱子和最后一个柱子不接雨水,直接跳过,其余每遍历一个柱子,都去找该柱子左边柱子(包括他自己)的最大高度和右边柱子(包括自己)的最大高度本列 所能接的雨水就是左边最高柱子和右边最高柱子的最小值减去他本身的高度(代码逻辑先把左边最高和右边最高初始化成了该柱子的高度,所以哪怕他本身最高,后续计算时h为0,本列只能接0雨水,符合逻辑),其实这段代码的h肯定 >= 0 ( 但是后面加个判断比较安全),最后sum加上每一列可以接的雨水就是最终结果

class Solution {//双指针优化版本(貌似不是双指针,而是dp预处理)
public:int trap(vector<int>& height) {if (height.size() <= 2) return 0;vector<int> maxLeft(height.size(), 0);vector<int> maxRight(height.size(), 0);int size = maxRight.size();// 记录每个柱子左边柱子最大高度maxLeft[0] = height[0];for (int i = 1; i < size; i++) {maxLeft[i] = max(height[i], maxLeft[i - 1]);}// 记录每个柱子右边柱子最大高度maxRight[size - 1] = height[size - 1];for (int i = size - 2; i >= 0; i--) {maxRight[i] = max(height[i], maxRight[i + 1]);}// 求和int sum = 0;for (int i = 0; i < size; i++) {int count = min(maxLeft[i], maxRight[i]) - height[i];if (count > 0) sum += count;}return sum;}
};
  • 其实也算暴力吧,就是前面第一种暴力解法有点冗余了,不需要每次新柱子都遍历一下前面的所有柱子找最大柱子,可以一次遍历全部记录下来(左边和右边分别一次),也是包含自身的左边柱子和右边柱子的最大高度

class Solution {  //单调栈解法
public:int trap(vector<int>& height) {if (height.size() <= 2) return 0; // 可以不加stack<int> st; // 存着下标,计算的时候用下标对应的柱子高度st.push(0);int sum = 0;for (int i = 1; i < height.size(); i++) {if (height[i] < height[st.top()]) {     // 情况一st.push(i);} if (height[i] == height[st.top()]) {  // 情况二st.pop(); // 其实这一句可以不加,效果是一样的,但处理相同的情况的思路却变了。st.push(i);} else {                                // 情况三while (!st.empty() && height[i] > height[st.top()]) { // 注意这里是whileint mid = st.top();st.pop();if (!st.empty()) {int h = min(height[st.top()], height[i]) - height[mid];int w = i - st.top() - 1; // 注意减一,只求中间宽度sum += h * w;}}st.push(i);}}return sum;}
};
  • 横向求解:这种解法和前两种不同,这个是横向求解(一层一层的接雨水,每次找到一个凹槽就接一层),每次求的柱子是该柱子的左边和右第一个比该柱子大的柱子,这里是第一个,不是所有左边或者右边最大的,这就是横向求解和纵向求解不同,每次遇到的元素比栈顶元素大时,栈顶元素就是mid,当前遍历的元素就是右边第一个比他大的柱子,将栈顶元素pop,下一个栈顶元素就是上一个栈顶元素左边第一个比他大的柱子(注意这里pop了一次,所以要判断st非空),接雨水的高度h为比他大的第一个左边的柱子和右边的柱子中的较小值再减去该柱子的高度,宽度就是下标相减再减去1,相乘就是雨水的体积,用sum加起来
http://www.jsqmd.com/news/740149/

相关文章:

  • Ultralytics LLM:将YOLO工程哲学带入大语言模型应用开发
  • 开源桌面示波器Haasoscope:FPGA+MCU架构与Python客户端全解析
  • 深度解析applera1n:基于checkm8漏洞的iOS激活锁绕过技术实现
  • 中山AI优化提供商哪家强?原来有这些选择!
  • OBS虚拟摄像头进阶玩法:除了共享屏幕,还能在腾讯会议里玩出什么花?
  • 毕业答辩前选哪款降 AI 软件?2026 排行前 5 让 AI 率降到 5% 以下! - 我要发一区
  • 第二章、application.properties文件的配置
  • 2026年5月六西格玛绿带黑带含金量排行|报考避坑榜Top5 - 众智商学院课程中心
  • Ubuntu Server 24.04下解决SunloginClient 向日葵依赖libgconf-2-4安装问题
  • SAP SD新手避坑:VA01创建销售订单报‘无定价过程’?手把手教你用OVKK搞定配置
  • 从Pikachu靶场看企业级Web安全:这些漏洞在真实业务中如何防御?
  • MAA明日方舟自动化助手完整指南:如何一键解放双手高效长草
  • 论文 AI 率从 78% 降到 3.2%!2026 排行前 3 降 AI 软件让你赶上答辩。 - 我要发一区
  • ESXi 7.0U3迁移实战:手把手教你用命令行把旧主机配置‘克隆’到新服务器
  • 告别串口助手!手把手教你用TC264打造一个“硬件版”参数配置器
  • 【读书笔记】《你就是孩子最好的玩具》
  • 2026年05月六西格玛黑带绿带推荐榜单:含金量排行与报考避坑指南 - 众智商学院课程中心
  • 保姆级教程:在Ubuntu 22.04上从源码编译安装Eclipse Paho C库,并手把手写一个MQTT同步客户端
  • OpenClown:为AI助手配备多维度专家评审团,提升输出质量与安全性
  • ROS2 C++开发系列04:如何有效输出机器人状态
  • 别再混着用了!搞懂nvidia-docker在WSL和物理Ubuntu下的不同‘脾气’,彻底解决GPU容器启动报错
  • UAGLNet:遥感图像建筑提取的多尺度特征融合技术
  • 保姆级教程:手把手教你用ONVIF协议,把乐橙WiFi摄像头稳定添加到海康威视DS-7104N录像机
  • 抖音批量下载终极方案:三步搞定无水印视频与音乐
  • Java图论实战:深入理解有向图与无向图的构建与应用
  • 从Transformer到GPT-4:手把手拆解LangChain如何‘驾驭’大模型做应用开发
  • 别只用来显示文字!蓝桥杯嵌入式LCD高亮、闪烁特效的三种实现方法
  • 跨区域团队如何借助Taotoken实现API密钥统一管理与审计
  • GeoServer发布WMS服务后,如何用QGIS和ArcGIS Pro进行专业级验证与样式调试?
  • 降 AI 软件单价多少合理?2026 排行 8 款从 3.2 到 8 元/千字横评! - 我要发一区