42. 接雨水

给定 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.大于s.top()

2.等于s.top()

3.小于s.top()

分别针对三种情况进行处理:

1.此时判断与左墙是否有间隙,如有则要进行“接雨水”,采用pop的方式将元素一一弹出并计数,(此时要为了后续可能还有更高的右墙与左墙接更多雨水,把相同水量的“墙”push进栈)。

最后还要判断是否要切换“左墙”

height[i]>=left时即要切换

2和3情况一样只需要push进新元素即可

class Solution {
public:int trap(vector<int>& height) {int left=0;int left_i=0;stack<int> s;int ret=0;for(int i=0;i<height.size();i++){if(left==0){if(height[i]!=0){left=height[i];left_i=i;s.push(i);}continue;}if(height[i]>height[s.top()]){int temp=left>height[i]?i:left_i;int num=0;while(!s.empty()&&s.top()!=left_i&&height[i]>height[s.top()]){ret+=height[temp]-height[s.top()];s.pop();num++;}while(num){s.push(temp);num--;}if(height[i]>=left){left=height[i];left_i=i;}}s.push(i);}return ret;}
};

方法二:求每个位置的左边最大值和右边最大值,再用这两个较小值-该位置值,即是该位置会接到的雨水

class Solution {
public:int trap(vector<int>& height) {vector<int> LeftMax(height.size());vector<int> RightMax(height.size());int ret=0,LeftMaxValue=0,RightMaxValue=0;for(int i=0;i<LeftMax.size();i++){LeftMaxValue=max(LeftMaxValue,height[i]);LeftMax[i]=LeftMaxValue;}for(int i=RightMax.size()-1;i>=0;i--){RightMaxValue=max(RightMaxValue,height[i]);RightMax[i]=RightMaxValue;}for(int i=0;i<height.size();i++){ret+=min(LeftMax[i],RightMax[i])-height[i];}return ret;}
};

3.22 42. 接雨水相关推荐

  1. 42. 接雨水 golang

    42. 接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这 ...

  2. 【LeetCode - 42. 接雨水】

    42. 接雨水 难度困难3164 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 示例 1: 输入:height = [0,1,0,2,1,0,1, ...

  3. LeetCode 每日一题 42. 接雨水 详细多种题解 C++描述

    LeetCode 每日一题 42. 接雨水 大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,一起加油吧~ 难度 困难 2020.04.04每日一题 ...

  4. 力扣——42.接雨水(困难难度)——条条大路通罗马

    力扣--42.接雨水 一.算法目录合集 1.地址 2.说明 二.题目说明 1.题干 2.原地址 三.实现步骤 1.思路分析 1.1.分析问题 1.2.转化问题 1.3.简化问题 1.4.具体步骤 ① ...

  5. LeetCode 图解 | 42. 接雨水

    点击关注上方"图解面试算法", 设为"置顶或星标",一起刷 LeetCode. 作者:ioc 今天的题目来源于 LeetCode 中第 42 题:接雨水,har ...

  6. Leetcode 42.接雨水 (每日一题 20210629)

    给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水.示例 1:输入:height = [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 解释: ...

  7. Leetcode 40组合总数(回溯)Ⅱ41缺失的第一个正数42接雨水

    维护公众号:bigsai ,回复进群加入打卡,回复bigsai分享一些学习资源! 上周第一次 LeetCode 36有效的数独&37解数独(八皇后问题) 上周第二次 LeetCode 38外观 ...

  8. leetcode 42. 接雨水 思考分析(暴力、动态规划、双指针、单调栈)

    目录 题目 思路 暴力法 动态规划 双指针法 单调栈 题目 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 输入:height = [0,1,0,2 ...

  9. leetcode 42 接雨水 单调栈

    接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下 ...

最新文章

  1. tomcat与resin的比较
  2. C++ Error: no appropriate default constructor available
  3. python优雅写法
  4. Ribbon负载均衡策略配置
  5. Python class 类中 __init__ 函数
  6. 2.Vivado软件基础操作
  7. 【前端模块】HTML5标签
  8. 代码统计工具有哪几种_跟我学“Linux”小程序Web版开发(四):引入统计及Crash收集...
  9. 用C#(.NET Core) 实现简单工厂和工厂方法设计模式
  10. @PathVariable 注解 说明
  11. java web启动socket_javaweb启动时启动socket服务端代码实现
  12. ObjectC----NSObject常用方法和OC反射机制
  13. vb6与access数据库交互常见问题——未完待续
  14. 可道云、NextCloud和Seafile使用体验比较哪个好用
  15. 海量数据搜索——搜索引擎
  16. 安卓pdf阅读器_【软件分享】自用的一款PDF阅读器——悦书PDF阅读器,支持护眼模式、注释涂鸦、PDF转换,功能齐全,界面简洁美观。...
  17. 显卡内存足够但是torch报错RuntimeError: CUDA out of memory
  18. 点到直线的垂直交点坐标 和 距离计算
  19. SONM挖矿收益计算器
  20. Unity Excel转Json小工具excel2json

热门文章

  1. linux 磁盘整理命令,Ubuntu磁盘整理命令汇总
  2. 扇贝python_扇贝编程(python)手机版-扇贝编程app下载v1.1.30-汉化新世纪
  3. excel怎么设置颜色的值记录
  4. ECharts统计图使用
  5. 书论92 侯仁朔《侯氏书品》
  6. Linux-用户与组群
  7. 开启mongodb数据库命令行_MongoDB服务启动命令及DB创建
  8. thinkphp6 jwt扩展
  9. 安卓开发仿微信图片拖拽_仿微信朋友圈发表图片拖拽和删除功能
  10. ASCII码对照表【2022年汇总】