leetcode 42 接雨水 单调栈

  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;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/424972.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第十八期:网页禁止复制粘贴怎么办?教你六招轻松搞定

经常在网上遇到一些无法复制的文章&#xff0c;那么问题来了&#xff0c;有什么办法可以绕开这种限制&#xff0c;将网页内容轻松下载回来呢&#xff1f; 经常在网上遇到一些无法复制的文章&#xff0c;那么问题来了&#xff0c;有什么办法可以绕开这种限制&#xff0c;将网页内…

[Leetcode][第99题][JAVA][恢复二叉搜索树][中序遍历]

【问题描述】[困难] 【解答思路】 1. 显示中序遍历 时间复杂度&#xff1a;O(N) 空间复杂度&#xff1a;O(N) class Solution {public void recoverTree(TreeNode root) {List<Integer> nums new ArrayList<Integer>();inorder(root, nums);int[] swapped find…

复盘二进制的习题(2)

338 Counting Bits。输入一个整数n&#xff0c;对于 0 ≤ i ≤ num&#xff0c;计算每个数的二进制1的个数。例如&#xff1a;num 5 返回 [0,1,1,2,1,2]。希望能在O(n)的时间内完成。这里有动态规划的思想。 思路一&#xff1a; 十进制数二进制表示0000010011(0的bits)20101…

c#XML的基本使用

创建XML文档 static void Main(string[] args){//1.引入命名空间//2.创建XML文档对象XmlDocument xmldoc new XmlDocument();//3.创建第一行描述信息&#xff0c;添加到xmldoc文档中XmlDeclaration xmldec xmldoc.CreateXmlDeclaration("1.0", "utf-8", …

第四十一期:深度解析5G核心网建设难点和挑战

目前核心网处于架构转型和业务转型的关键期。在架构层面&#xff0c;NFV、CU分离、边缘计算等技术的成熟推动核心网络架构转型&#xff0c;控制面进一步集中&#xff0c;转发面进一步下沉。 目前核心网处于架构转型和业务转型的关键期。在架构层面&#xff0c;NFV、CU分离、边缘…

linux 进入一个中文乱码的目录的方法

bash命令&#xff1a;cd ls | awk NRxxx awk命令&#xff1a;获取第xxx行的目录名称&#xff0c;加上NR表示从第一行开始读的行号取 NR已经读出的记录数&#xff0c;就是行号&#xff0c;从1开始 用|把ls的结果传给后面的awk命令&#xff0c;连接上前面的cd就能进入啦 导引号…

[Leetcode][第696题][JAVA][计算二进制子串][分组]

【问题描述】[简单] 【解答思路】 1. 按字符分组 将字符串 ss 按照 00 和 11 的连续段分组&#xff0c;存在counts 数组中&#xff0c;例如 s 00111011&#xff0c;可以得到这样的counts 数组&#xff1a;counts{2,3,1,2}。 这里counts 数组中两个相邻的数一定代表的是两种…

第五章数理统计--样本和抽样分布

从今天开始要学习数理统计。 概率论&#xff1a;是专门研究随机现象的一门学科&#xff0c;定量描述随机现象及其规律。 数理统计&#xff1a;数理统计的研究对象是数据&#xff0c;包括对数据的采集、整理、分析、建模。主要任务是获取样本、描述样本&#xff0c;从样本得到…

Scrapy安装报错

python3 pip 安装Scrapy在win10 安装报错error: Microsoft Visual C 14.0 is required. Get it with "Microsoft Visual C Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-tools 问题描述 当前环境win10&#xff0c;python_3.6.1&#xff0c;64…

第四十三期:2020年企业面临的20大数据安全风险

为了帮助企业为日益增长的确定性风险做好准备&#xff0c;以下我们总结了企业2020年可能面临的20种数据安全风险。 如今&#xff0c;数据安全已成为公司、消费者和监管机构的头等大事。 近年来数据泄露和隐私事故越来越普遍&#xff0c;而且代价高昂。Risk Based Security的一…

[Leetcode][第93题][JAVA][复原IP地址][剪枝][回溯]

【问题描述】[中等] 【解答思路】 1. 递归 回溯剪枝 复杂度 class Solution {static final int SEG_COUNT 4;List<String> ans new ArrayList<String>();int[] segments new int[SEG_COUNT];public List<String> restoreIpAddresses(String s) {segmen…

函数嵌套

目录 一、函数的嵌套定义二、函数的嵌套调用一、函数的嵌套定义 函数内部定义的函数&#xff0c;无法在函数外部使用内部定义的函数。 def f1():def f2():print(from f2)f2()f2() # NameError: name f2 is not defined def f1():def f2():print(from f2)f2()f1() from f2 现在…

第六章 参数估计

依据样本推出总体分布的参数&#xff0c;方法有两种&#xff1a;矩估计和极大似然估计。  参数估计的形式有&#xff1a;点估计和区间估计。  点估计&#xff1a;构造合适的统计量θˆθˆ(X1,X2,...Xn)用来估计未知参数θ&#xff0c;θˆ称为参数θ的点估计量。  当给定…

第四十四期:1.3万亿条数据查询如何做到毫秒级响应?

知乎&#xff0c;在古典中文中意为“你知道吗?”&#xff0c;它是中国的 Quora&#xff0c;一个问答网站&#xff0c;其中各种问题由用户社区创建&#xff0c;回答&#xff0c;编辑和组织。 图片来自 Pexels 作为中国最大的知识共享平台&#xff0c;我们目前拥有 2.2 亿注册用…

Python拷贝梳理

python中存在与其他语言不同的概念&#xff0c;现在梳理一下相关概念。 其中 变量&#xff1a;拥有指向对象的连接空间&#xff0c;即引用空间的代称。 引用&#xff1a;指变量指向对象的指针。 对象&#xff1a;指变量声明后所产生的内存空间。 可变对象&#xff1a;表示…

sql一对多查询

子查询返回的值不止一个。当子查询跟随在 、!、<、<、>、> 之后&#xff0c;或子查询用作表达式时&#xff0c;这种情况是不允许的。 正确写法&#xff1a; select Material_Manage.MaterialNum,Material_Manage.MaterialName,Material_Manage.MaterialWeight,Mate…

[Leetcode][第130题][JAVA][被围绕的区域][DFS][BFS]

【问题描述】[中等] 【解答思路】 1. 深度优先搜索 使用深度优先搜索实现标记操作。在下面的代码中&#xff0c;我们把标记过的字母 O 修改为字母 A。 复杂度 class Solution {int[] dx {1, -1, 0, 0};int[] dy {0, 0, 1, -1};public void solve(char[][] board) {int n …

第四十五期:程序员未来干什么?做架构还是做管理?

很多程序员应该都会有这个疑问&#xff0c;尤其是工作经验不多的&#xff0c;对未来充满了期待。在我职业生涯的早期&#xff0c;比较偏重于走管理路线&#xff1b;现在呢&#xff0c;成了公司的架构师&#xff0c;当然也会承担一部分的管理工作。 很多程序员应该都会有这个疑问…

leetcode之回溯backtracing专题1

39 Combination Sum 给一组整数&#xff0c;给一个目标整数。从数组中任意选择几个数&#xff0c;这几个数的和等于目标整数。数组中每个数字可以选择多次。  例如given candidate set [2, 3, 6, 7] and target 7, 返回 [ [7], [2, 2, 3] ] 思路&#xff1a;数组candidat…

第十九期:HTTPS虐我千百遍,我却待她如初恋!

本篇将讨论 HTTPS 的加解密原理&#xff0c;很多人都知道 RSA&#xff0c;以为 HTTPSRSA&#xff0c;使用 RSA 加解密数据&#xff0c;实际上这是不对的。 图片来自 Pexels HTTPS 是使用 RSA 进行身份验证和交换密钥&#xff0c;然后再使用交换的密钥进行加解密数据。 身份验…