3.22 42. 接雨水
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. 接雨水相关推荐
- 42. 接雨水 golang
42. 接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这 ...
- 【LeetCode - 42. 接雨水】
42. 接雨水 难度困难3164 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 示例 1: 输入:height = [0,1,0,2,1,0,1, ...
- LeetCode 每日一题 42. 接雨水 详细多种题解 C++描述
LeetCode 每日一题 42. 接雨水 大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,一起加油吧~ 难度 困难 2020.04.04每日一题 ...
- 力扣——42.接雨水(困难难度)——条条大路通罗马
力扣--42.接雨水 一.算法目录合集 1.地址 2.说明 二.题目说明 1.题干 2.原地址 三.实现步骤 1.思路分析 1.1.分析问题 1.2.转化问题 1.3.简化问题 1.4.具体步骤 ① ...
- LeetCode 图解 | 42. 接雨水
点击关注上方"图解面试算法", 设为"置顶或星标",一起刷 LeetCode. 作者:ioc 今天的题目来源于 LeetCode 中第 42 题:接雨水,har ...
- Leetcode 42.接雨水 (每日一题 20210629)
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水.示例 1:输入:height = [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 解释: ...
- Leetcode 40组合总数(回溯)Ⅱ41缺失的第一个正数42接雨水
维护公众号:bigsai ,回复进群加入打卡,回复bigsai分享一些学习资源! 上周第一次 LeetCode 36有效的数独&37解数独(八皇后问题) 上周第二次 LeetCode 38外观 ...
- leetcode 42. 接雨水 思考分析(暴力、动态规划、双指针、单调栈)
目录 题目 思路 暴力法 动态规划 双指针法 单调栈 题目 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 输入:height = [0,1,0,2 ...
- leetcode 42 接雨水 单调栈
接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下 ...
最新文章
- tomcat与resin的比较
- C++ Error: no appropriate default constructor available
- python优雅写法
- Ribbon负载均衡策略配置
- Python class 类中 __init__ 函数
- 2.Vivado软件基础操作
- 【前端模块】HTML5标签
- 代码统计工具有哪几种_跟我学“Linux”小程序Web版开发(四):引入统计及Crash收集...
- 用C#(.NET Core) 实现简单工厂和工厂方法设计模式
- @PathVariable 注解 说明
- java web启动socket_javaweb启动时启动socket服务端代码实现
- ObjectC----NSObject常用方法和OC反射机制
- vb6与access数据库交互常见问题——未完待续
- 可道云、NextCloud和Seafile使用体验比较哪个好用
- 海量数据搜索——搜索引擎
- 安卓pdf阅读器_【软件分享】自用的一款PDF阅读器——悦书PDF阅读器,支持护眼模式、注释涂鸦、PDF转换,功能齐全,界面简洁美观。...
- 显卡内存足够但是torch报错RuntimeError: CUDA out of memory
- 点到直线的垂直交点坐标 和 距离计算
- SONM挖矿收益计算器
- Unity Excel转Json小工具excel2json