代码随想录算法训练营第六十二天| LeetCode503.下一个更大元素II、42. 接雨水

一、LeetCode503.下一个更大元素II

题目链接/文章讲解/视频讲解:https://programmercarl.com/0503.%E4%B8%8B%E4%B8%80%E4%B8%AA%E6%9B%B4%E5%A4%A7%E5%85%83%E7%B4%A0II.html

状态:已解决

1.思路 

        这道题和前面的题有稍许不同,考察了循环数组的运用,而一般循环数组的题我们采取的措施是将数组复制一份与原数组拼起来,结果数组也要跟着延长(因为在遇到当前元素比栈顶元素大的情况,出栈栈顶元素的时候要将当前元素的值作为栈顶元素对应的结果,如果不延长我们还要判断一下栈顶元素是否在0~nums.size()的范围内),这样求解出来的result数组就是原数组的两倍,因此最后还需要重塑一下数组为原数组的大小(即取结果数组前面的部分即可)

2.代码实现

class Solution {
public:vector<int> nextGreaterElements(vector<int>& nums) {vector<int> result(nums.size()*2,-1);vector<int> nums1(nums.begin(),nums.end());nums.insert(nums.end(),nums1.begin(),nums1.end());stack<int> s;if(nums.size()==0) return result;s.push(0);for(int i=1;i<nums.size();i++){if(nums[i]<=nums[s.top()]){s.push(i);}else{while(!s.empty() && nums[i] > nums[s.top()]){result[s.top()] = nums[i];s.pop();}s.push(i);}}result.resize(nums.size()/2);return result;}
};

二、42. 接雨水

题目链接/文章讲解/视频讲解:https://programmercarl.com/0042.%E6%8E%A5%E9%9B%A8%E6%B0%B4.html

状态:已解决 

1.思路

        感觉我讲不好,建议还是看连接中的文章讲解。这道题理解的关键在于如何计算积水量:根据面积算的。

        如图,我们将蓝色部分拆成上下拼接的方形,然后计算各个方形的面积。我们知道,计算面积实则就是计算长*宽。 这里的长就是围成凹形区域的两个柱子之间的距离,宽就是两个柱子的最小值减去底部柱子的高度。那么问题又来到如何找到围城凹形区域的两根柱子上来了:其实就是维护单调栈(从栈顶到栈底)单增的顺序。当当前遍历元素高度大于栈顶时,说明当前元素可以和栈里面的部分元素构成凹形区域:

        那么,栈顶元素就是底部柱子,栈顶元素的下一个元素就凹形区域的左柱子,当前元素就是凹形区域的右柱子。

        理解了上面部分,99%的思路就能想明白了,但还有一点,就是当当前元素等于栈顶元素高度时,如图。

 

        此时凹形区域应该由右边柱子围成,故遇到相等情况时,弹出栈顶元素,把当前元素放进去,替换掉上一个柱子。

2.代码实现 

class Solution {
public:int trap(vector<int>& height) {stack<int> s;int sum=0;s.push(0);for(int i=1;i<height.size();i++){if(height[i]<height[s.top()]){s.push(i);}else if(height[i] == height[s.top()]){//注意这个相等情况。s.pop();s.push(i);}else{while(!s.empty() && height[i]>height[s.top()]){
//注意,由于凹形区域可能由几个小的凹形区域构成,因此计算完一块凹形区域后,
//还要看当前元素是否又跟新的栈顶构成凹形区域,故用whileint bottom = height[s.top()];//底部柱子s.pop();if(!s.empty()){//注意要看栈弹出一个元素是否为空int leftHeight = height[s.top()];//左柱子int rightHeight = height[i];//右柱子sum += (min(rightHeight,leftHeight)-bottom)*(i-s.top()-1);//长*宽}}s.push(i);}}return sum;}
};

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

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

相关文章

基于Springboot+Vue的Java项目-宠物商城网站系统开发实战(附演示视频+源码+LW)

大家好&#xff01;我是程序员一帆&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &am…

docker镜像nginx1.26.0版本,与删除docker容器【灵异事件】

为了http3 的这个模块&#xff0c;所以需要升级nginx的版本&#xff0c;需要nginx1.26.0才有 –with-http_v3_module 这个模块 为什么记录一下&#xff1f;因为觉得奇怪 1&#xff1a;删除nginx镜像&#xff0c;显示镜像还被某个容器在使用 luichunluichun:~$ docker rmi ng…

HTML5 + CSS3实现卖茶女与水果男的巅峰微信聊天对决,看完后笑一整天

记得之前看过一段卖茶女与水果男的聊天视频&#xff0c;当时觉得真有意思&#xff0c;竟然还可以这样热爱自己的事业。我就想&#xff0c;用HTML5 CSS3实现一下这个过程&#xff0c;锻炼了技术&#xff0c;也娱乐了开发人员&#xff0c;多有意思的一件事啊。 目录 1 实现思路…

frida反检测

一、frida介绍 简单来说&#xff0c;Frida是一个动态代码插桩框架。这意味着它能够在程序运行的时候&#xff0c;不改变原有程序代码的情况下&#xff0c;让你往里面添加自己的代码片段。这听起来可能有点像魔法&#xff0c;但实际上&#xff0c;它是通过一种叫做“HOOK”的技术…

六西格玛遇上AI:质量提升进入“快车道”

人工智能&#xff08;AI&#xff09;与六西格玛管理方法——正在慢慢接近我们的视野中&#xff0c;预示着在质量管理中一场改革重大改革将要到来。 AI&#xff0c;作为科技的前沿&#xff0c;正以其强大的数据处理能力和机器学习能力&#xff0c;为质量管理提供全新的视角。它…

QT---day5,通信

1、思维导图 2、TCp 服务器 #ifndef MYWIDGET_H #define MYWIDGET_H #include <QWidget> #include <QTcpServer> #include <QList> #include <QTcpSocket> #include <QMessageBox> #include <QDebug> #include <QTcpServer> QT_B…

Elasticsearch查看集群信息,设置ES密码,Kibana部署

Elasticsearch查看集群信息&#xff0c;设置ES密码&#xff0c;Kibana部署 查看集群信息查看节点信息查看集群健康状态查看分片信息查看其他集群信息 Kibana部署安装设置ES密码 查看集群信息 查看节点信息 curl http://127.0.0.1:9200/_cat/nodes?v 参数说明&#xff1a; ip…

【Redis】用户登录校验

对于用 redis 对用户进行登录校验&#xff0c;大致可分为以下六步&#xff1a; 首先通过查询数据库来查找具有提供的用户名、密码和delFlag值为0的用户。如果未找到用户&#xff0c;则抛出一个带有消息"用户不存在"的ClientException&#xff08;用户不存在&#xf…

做海外跨境电商难不难?做7-8年,发现卖家主要分三大群体!

做海外跨境电商&#xff0c;卖家有三大群体&#xff1a; 第一种&#xff1a;跨境头部大卖家&#xff0c;这些都是有综合优势的卖家&#xff0c;不论是供应链、还是资金量、还是运营团队&#xff0c;各方面硬实力都很强大&#xff0c;这也是中小卖家短时间难以企及的优势。 第二…

[C++核心编程-07]----C++类和对象之友元应用

&#x1f3a9; 欢迎来到技术探索的奇幻世界&#x1f468;‍&#x1f4bb; &#x1f4dc; 个人主页&#xff1a;一伦明悦-CSDN博客 ✍&#x1f3fb; 作者简介&#xff1a; C软件开发、Python机器学习爱好者 &#x1f5e3;️ 互动与支持&#xff1a;&#x1f4ac;评论 &…

java中EQ、NE、GE、GT、LE、LT

关系运算符 包括EQ、NE、GE、GT、LE、LT几个&#xff0c;关系运算符返回的是真“True”或假“False”。 eq&#xff08;Equal to&#xff09; 等 运算符 &#xff0c;如果运算符两边相同则返回真&#xff0c;否则返回假&#xff1b; ne&#xff08;Not Equal to&#xff09; 不…

JavaScript基础(六)

break & continue continue跳出本次循环&#xff0c;继续下面的循环。 break跳出终止循环。 写个简单的例子: <script> for (var i1; i<5; i){ if (i3){ continue; } console.log(i); } </script> 结果就是跳过i等于3的那次循环&#xff0c;而break: f…