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

上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 感谢 Marcos 贡献此图。

示例:

输入: [0,1,0,2,1,0,1,3,2,1,2,1]
输出: 6

题解:
暴力的话就是m*n复杂度 可能会超时 考虑一下其他方案
要求的就是蓝色区域,也就是凹进去的部分。那么如何求解凹进去的部分,就是要对每一块凹进去的部分得到左右两边的边界信息,通过边界得到有多少块小方块可以填满,那么凹进去的形状是很多样的,如何正确求解?我们可以对每一个高度维护一个“凹”信息,也就是把凹的前半部分放到一个数据结构里,那么当我们走到凹的后半部分时候,就可以结合前半部分的数据进行计算,也就是对每一个位置的高度,如果前面有坑,也就是可以积水,那么我们就要拿到前面的积水左边界的高度和位置信息,由此可知,我们要用一个栈去维护,当我遇到一个高一点的位置,就要拿出之前放进去最近的左边界的信息用来计算。

栈里要用的就像是括号匹配一样的,只需要记录左括号,也就是凹的左边界信息,那么维护一个下降高度的单调栈,栈内的元素表示由近到远的递增位置信息。于是我们遍历每一个位置,对当前位置,
如果比栈顶元素小,那么入栈进来形成一个递减的高度,也就是凹左边界信息
如何和栈顶元素相同,那么也就形成一个平台,我们只需要保留最近的一个位置就好了,用新位置代替原栈顶元素;
如果比栈顶元素大,表示可能形成一个凹区域,就要仔细判断了:我们要把所有可能和当前位置形成积水的所有之前的位置都处理掉才能计算出正确答案,那就一直弹出栈顶元素,直到栈空或者遇到一个比当前元素更大的位置。那么也就是栈中的元素就是维护一个每一个小凹区域的积水的信息,对每一个栈顶元素,我们要计算这之间的积水信息。也就需要这两个位置之间的高度差还有与地面形成的高度差才能正确计算,前者好算后者就通过我们每次记录一个pre,通过这个pre来计算凹区域中最凹中间的高度,由此就可以计算出正确答案。

class Solution {public:int trap(vector<int>& height) {stack<int>s;int ans=0,pre;for(int i=0;i<height.size();i++){if(s.size()) {if(height[i]<height[s.top()])s.push(i);else if(height[i]==height[s.top()]){s.pop();s.push(i);}else {//大于栈顶 把大于栈内的所有元素出栈pre=-1;while(s.size()&&height[i]>=height[s.top()]){if(pre==-1)pre = height[s.top()],s.pop();else {ans+=(i-s.top()-1)*(min(height[i],height[s.top()])-pre);pre=height[s.top()];s.pop();}}if(s.size()&&height[i]<height[s.top()]){ans+=(i-s.top()-1)*(min(height[i],height[s.top()])-pre);if(height[i]==height[s.top()])s.pop(),s.push(i);}s.push(i);                    }}else {if(height[i]>0)s.push(i);else continue;}}return ans;}
};

leetcode 42 接雨水 单调栈相关推荐

  1. 使用单调栈解决接雨水问题——LeetCode 42 接雨水+单调栈说明

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

  2. LeetCode 42. 接雨水(双指针、单调栈)

    文章目录 1. 题目 2. 解题 2.1 正反扫描法 2.2 双指针 2.3 单调栈 1. 题目 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 上 ...

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

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

  4. leetcode 739. 每日温度 单调栈解法和暴力法及其优化 c代码

    如题: 根据每日 气温 列表,请重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高超过该日的天数.如果之后都不会升高, 请在该位置用 0 来代替.例如,给定一个列表 temperature ...

  5. 【LeetCode - 42. 接雨水】

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

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

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

  7. leetcode 42. 接雨水

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

  8. 牛客 小米校招 计算题 单调栈 接雨水

    给定n个非负整数表示每个宽度为1的柱子的高度题,计算按此排列的柱子,下雨之后能接多少雨水. 经典的题目 leetcode 42 接雨水 单调栈 保持栈内单调递减 每次把一个矮的出栈都能够加上一大块面积 ...

  9. 单调栈 leetcode整理(三)

    目录 42. 接雨水 思路分析 901. 股票价格跨度 思路 581. 最短无序连续子数组 思路一:排序+双指针 思路二:单调栈 思路三:双指针(最省时) 42. 接雨水 42. 接雨水 给定 n 个 ...

最新文章

  1. hashCode之一--两个对象值相同,有相同的hash code
  2. 算法导论之NP完全性和近似算法
  3. Java序列化接口Serializable接口的作用总结
  4. Github 简明教程 - 添加远程库
  5. 最老程序员创业札记:全文检索、数据挖掘、推荐引擎应用33
  6. 吴恩达深度学习 —— 2.18(选修)逻辑回归损失函数的解释
  7. 软件开发的核心问题是什么
  8. C# 给自己写的软件,加注册码功能。
  9. 无法在驱动器0分区上安装windows 解决方法
  10. 在VirtualBox中体验Fedora15与GNOME3
  11. 京东超市 导航条布局
  12. 地址总线、数据总线、控制总线详细解释
  13. Industry工业软件开发平台设计A-1
  14. PHP程序判断男女身高体重是否,最新男女标准体重对照表,快来看看你达标了没?...
  15. 涉密计算机涉密存储设备或者改作其他用途的,将未经安全技术处理的退出使用的涉密计算机涉密存储设备或者改作其他用途的依法给予处分...
  16. Access数据库,以及一些其他的库。
  17. HTML/CSS——微信公众号二维码显示效果
  18. C语言人五英尺七英寸,5尺7寸(5尺7寸是多高美国)
  19. 赵神牛的游戏(过程分析与结果分析)
  20. Chrome浏览器开发调试系列(一)

热门文章

  1. 11. Android框架和工具之 Logger(调试代码)
  2. 选项卡,下拉菜单操做时的页面数据更新,highcharts,d3 结合。
  3. PHP的time函数返回时间不正确
  4. Windows Phone本地数据库(SQLCE):3、[table]attribute(翻译) (转)
  5. 张小二:做一个幸福的胖子
  6. (转载)最黑的黑客米特尼克:多次耍FBI 终被高手擒
  7. 地贝扫地机器人维修_扫地机器人常见故障及维修方法
  8. 动态表格数据序号从1开始_EXCEL对面的表姐看过来,你真的会给表格添加序号吗?...
  9. linux:vi 替换命令
  10. svn locked解决方法