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

LeetCode42.接雨水(单调栈)

题目

给定 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 个单位的雨水(蓝色部分表示雨水)。 

思路:

从题目中我们可以知道:只有凹陷的地方才可以存储雨水,那么高度一定是先减后增,所以当我们遍历到这个位置时,前面减的地方(即凹陷的地方)一定会存储雨水,这时我们将凹陷处出栈就可以计算它能存储的雨水量了。
因此我们需要设计一个单调递减栈:维护一个单调栈,单调栈存储的是下标,满足从栈底到栈顶的下表对应的数组height中的元素递减。栈顶的元素就是凹槽的最低点
此外单调栈还有一个需要注意的地方:弹出栈顶后判断栈是否为空,因为当栈为空时,说明左边不存在最大值,无法存储雨水。

Code:

class Solution {
public:int trap(vector<int>& height) {if(height.size() <= 1){return 0;}stack<int>st;int sum=0;st.push(0);for(int i=1 ; i < height.size() ; i++){while(!st.empty() && height[i] > height[st.top()]){int vis = st.top();st.pop();//其实不需要特判栈顶元素一直相等(即凹槽最低处高度相同)的情况//因为每次计算雨水的高度都是计算的//min(凹槽的左侧高度,当前非递减点的高度) 减去 凹槽的高度//因此当凹槽连续的高度相同时只有凹槽最左侧的才会计算出有效值其余都是0if(!st.empty()){int l = i - st.top() -1;int h = min(height[i] , height[st.top()]) - height[vis];sum += l*h;}}st.push(i);}return sum;}
};
http://www.lryc.cn/news/302208.html

相关文章:

  • 黄东旭:“向量数据库”还是“向量搜索插件 + SQL 数据库”?丨我对 2024 年数据库发展趋势的思考
  • Spark编程实验五:Spark Structured Streaming编程
  • 【已解决】引发的异常: 0xC0000005: 读取位置 0xFFFFFFFFFFFFFFFF 时发生访问冲突。
  • Python Flask高级编程之RESTFul API前后端分离(学习笔记)
  • Windows如何打开投影到此电脑
  • 【BUG】段错误
  • 深入理解指针(3)
  • ssm在线学习平台-计算机毕业设计源码09650
  • 【Linux 内核源码分析】内存映射(mmap)机制原理
  • 贪心算法之合并区间
  • Eclipse - Colors and Fonts
  • java 数据结构LinkedList类
  • 第五次作业(防御安全)
  • 阿里云香港轻量应用服务器是什么线路?
  • C# Winform .net6自绘的圆形进度条
  • Git基本操作(超详细)
  • 【AGI视频】Sora的奇幻之旅:未来影视创作的无限可能
  • Docker部署nginx
  • C++Qt——自定义信号与槽
  • 提高项目的性能和响应速度的方法
  • QT学习事件
  • 第13章 网络 Page818 UDP(和TCP的比较)
  • EMQX Enterprise 5.4 发布:OpenTelemetry 分布式追踪、OCPP 网关、Confluent 集成支持
  • 记录 | C++ cout.setf(ios::fixed)
  • Eclipse 创建 Hello World 工程
  • 【前端工程化面试题】vite热更新原理
  • 【leetcode】判断二叉树是否完全二叉树
  • Java多线程系列——内存模型JMM
  • 深入理解 Vue3 中的 setup 函数
  • 【QT+QGIS跨平台编译】之三十六:【RasterLite2+Qt跨平台编译】(一套代码、一套框架,跨平台编译)