代码随想录Day63 |503.下一个更大元素II 42. 接雨水

代码随想录Day63 |503.下一个更大元素II 42. 接雨水

  • 503.下一个更大元素II
  • 42.接雨水
    • 双指针
    • 单调栈

503.下一个更大元素II

文档讲解:代码随想录
视频讲解: 单调栈,成环了可怎么办?LeetCode:503.下一个更大元素II
状态

单调栈中存储的元素和单调性都和之前一样

主要是对循环数组怎么处理

//循环数组的处理方法
//循环数组相当于是需要遍历两次原本的数组
//1. 可以再复制一个数组在原本的数组后面
//2. 将遍历的循环长度增加为2*n-1,然后对i取mod(n)那么超过n的i也会变为i
class Solution {
public:vector<int> nextGreaterElements(vector<int>& nums) {int len = nums.size();vector<int> res(len,-1);if(len == 0) return res;stack<int> check;check.push(0);for(int i = 1;i<2*len-1;i++){while(!check.empty() && nums[i%len] > nums[check.top()]){res[check.top()] = nums[i%len];check.pop();}check.push(i%len);}return res;}
};

42.接雨水

文档讲解:代码随想录
视频讲解: 单调栈,经典来袭!LeetCode:42.接雨水
状态

双指针

两个指针分别从头和尾向中间移动,并记录扫描过的左端和右端木板最大值。
当右端木板最大值比左端木板最大值大时,我们考虑左指针指向的当前木板。那么其一定是可以存水的,因为其右边有比他高的木板。具体存水量是当前的左端最大值减去当前木板高度。

//双指针
class Solution {
public:int trap(vector<int>& height) {int left = 0;int right = height.size()-1;int res = 0;int leftmax = height[left];int rightmax = height[right];while(left <= right){leftmax = max(leftmax,height[left]);rightmax = max(rightmax,height[right]);//当左边的最高小于右边最高//可以以左边木板的高度来确定盛水量,因为右边始终有一个比他高的为他兜底//有点贪心的想法//盛水量就是左边的最大值减去当前木板的高度。if(leftmax<rightmax){res += leftmax-height[left];left++;}else{res += rightmax-height[right];right--;}}return res;}
};

单调栈

对于一个下标i寻找其左边的第一个大值和右边第一个大值,这个位置的积水量就可以求得
对于栈内一个可以积水的情况,栈头元素表示当前木板,栈头第二个元素应当表示当前木板的左边最大值,待入栈元素表示当前木板的右边木板。所以在该单调栈中应该是栈头元素较小,栈底元素较大。
在这里插入图片描述
当遇到与栈头相同的元素要入栈时,应当弹出栈头,压入最新的下标。
栈中存放的元素:当前木板的下标。

class Solution {
public:int trap(vector<int>& height) {int res = 0;stack<int> check;check.push(0);for(int i = 1;i<height.size();i++){//如果待压入元素比栈头元素小直接压入if(height[i] < height[check.top()]){check.push(i);}//如果相等,先弹出再压入else if(height[i] == height[check.top()]){check.pop();check.push(i);}//如果大,那说明可以计算积水量else{while(!check.empty() && height[i] > height[check.top()]){//当前积水的木板int mid = check.top();check.pop();if(!check.empty()){//计算积水高度,应当是栈头第二个元素和待压入元素的最小值int h = min(height[check.top()],height[i]) - height[mid];//计算积水宽度int w = i-check.top()-1;res += h*w;}}//压入check.push(i);}}return res;}
};

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

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

相关文章

基于Java SSM框架实现高考填报信息系统项目【项目源码】计算机毕业设计

基于java的SSM框架实现高考填报信息系统演示 JAVA简介 Java主要采用CORBA技术和安全模型&#xff0c;可以在互联网应用的数据保护。它还提供了对EJB&#xff08;Enterprise JavaBeans&#xff09;的全面支持&#xff0c;java servlet API&#xff0c;JSP&#xff08;java serv…

【深度学习笔记】4_6 模型的GPU计算

注&#xff1a;本文为《动手学深度学习》开源内容&#xff0c;部分标注了个人理解&#xff0c;仅为个人学习记录&#xff0c;无抄袭搬运意图 4.6 GPU计算 到目前为止&#xff0c;我们一直在使用CPU计算。对复杂的神经网络和大规模的数据来说&#xff0c;使用CPU来计算可能不够…

OpenAI 与开源多语言嵌入模型

原文地址&#xff1a;OpenAI vs Open-Source Multilingual Embedding Models 选择最适合您的数据的模型 2024 年 2 月 25 日 OpenAI最近发布了他们的新一代embedding模型&#xff0c;称为embeddingv3&#xff0c;他们描述是他们性能最好的embedding模型&#xff0c;具有更高…

Spring Security-实现自定义退出登录

文章目录 Spring Security 实战干货:实现自定义退出登录退出登录需要我们做什么?Spring Security 中的退出登录过程实现自定义退出登录请求URL处理具体的逻辑退出成功逻辑Spring Security 退出登录实战Spring Security 实战干货:实现自定义退出登录 Spring Security 实战干…

企业微信主体怎么转让给别人?

企业微信变更主体有什么作用&#xff1f;当我们的企业因为各种原因需要注销或已经注销&#xff0c;或者运营变更等情况&#xff0c;企业微信无法继续使用原主体继续使用时&#xff0c;可以申请企业主体变更&#xff0c;变更为新的主体。企业微信变更主体的条件有哪些&#xff1…

Zookeeper启动报错排查

前言&#xff1a;生产linux部署的zookeeper&#xff0c;执行启动脚本后&#xff0c;还是无法使用&#xff0c;故进行重启排查 在zookeeper的bin目录下执行 ./zkServer.sh start-foreground 可实时查看启动日志排查问题 根据上面的日志可以看出&#xff0c;是zoo.cfg配置文件里…

绿幕背景抠图SDK解决方案

随着影像技术的日益发展和普及&#xff0c;视频制作和图像处理已经成为众多行业不可或缺的一环。美摄科技&#xff0c;作为业内领先的影像技术提供商&#xff0c;针对企业需求&#xff0c;推出了全新的绿幕背景抠图SDK解决方案&#xff0c;旨在为企业提供更加高效、精准的影像处…

Java技术发展历程中的六大春天:从Web开发到大数据战略

Java技术发展历程中的六大春天&#xff1a;从Web开发到大数据战略 Six Springs in the Development Journey of Java Technology: From Web Development to Big Data Strategy 自Java诞生以来&#xff0c;其发展历程中出现了多个关键的“春天”时刻&#xff0c;每一段历程都伴随…

Mysql和Redis笔记(不断更新......)

Mysql in、on、exist - 使用 ON 的例子&#xff08;表连接&#xff09;&#xff1a; 假设有两个表 学生 和 课程&#xff0c;它们分别包含学生信息和课程信息。我们可以使用 INNER JOIN 来连接这两个表&#xff0c;通过学生ID关联它们。 SELECT 学生.姓名, 课程.课程名 FROM…

SpringBoot接收前端传递参数

1&#xff09;URL参数 参数直接 拼接在URL的后面&#xff0c;使用 ? 进行分隔&#xff0c;多个参数之间用 & 符号分隔。例如&#xff1a;http://localhost:8080/user?namezhangsan&id1后端接收&#xff08;在Controller方法的参数列表中使用 RequestParam 注解&…

编程笔记 html5cssjs 088 JavaScript 数组

编程笔记 html5&css&js 088 JavaScript 数组 一、定义和创建数组二、访问数组元素三、数组属性与方法四、迭代和遍历数组五、数组的特性六、数组方法和迭代器&#xff08;如keys(), values(), entries()&#xff09;七、数组的用途总结 JavaScript数组是一种特殊的数据…

flashback to timestamp 耗时

flashback pluggable database XX to timestamp to_date(2024-02-26 13:11:56,yyyy-mm-dd hh24:mi:ss); 1TB 花费2小时&#xff0c;如果做了还原点好像很快 select trunc( a.FIRST_TIME,HH24),count(*) from v$flashback_database_logfile a group by trunc( a.FIRST_TIME,…

ADC制剂生产过程中的微粒控制-隧道烘箱在线粒子监测系统 中邦兴业

ADC制剂生产过程中的污染和交叉污染控制需要从多个方面入手&#xff0c;包括生产环境、设备、原辅料、生产过程、人员卫生和培训以及微生物监控等。只有全面、有效地实施这些控制措施&#xff0c;才能确保ADC制剂的质量和安全性。 ADC制剂生产过程中的微粒控制 ADC制剂生产中的…

StarRocks之监控管理(内含DashBoard模板)

先看下最终效果图 架构 Prometheus 是一个拥有多维度数据模型的、灵活的查询语句的时序数据库。它可以通过 Pull 或 Push 采集被监控系统的监控项,存入自身的时序数据库中。并且通过丰富的多维数据查询语言,满足用户的不同需求。 Grafana 是一个开源的 Metric 分析及可视化系…

Java 面试题基础(二)

Java 面试题基础&#xff08;二&#xff09; 前言1、抽象方法能否是静态的&#xff08;static&#xff09;&#xff1f;2、阐述静态变量和实例&#xff08;普通&#xff09;变量的区别&#xff1f;3、静态方法内部可以调用普通方法吗&#xff1f;4、如何实现对象克隆&#xff1…

SVG是什么

SVG&#xff0c;全称Scalable Vector Graphics&#xff0c;指的是可缩放矢量图形。它是一种基于XML的二维矢量图形标准&#xff0c;由万维网联盟&#xff08;World Wide Web Consortium&#xff0c;W3C&#xff09;开发。SVG使用XML格式来定义图形&#xff0c;这意味着除了IE8之…

右值引用的意义 以及 move函数,forward完美转发

文章目录 右值引用的意义move 函数forward 完美转发 右值引用的意义 直观意义&#xff1a; 为临时变量续命&#xff0c;也就是为右值续命&#xff0c;因为右值在表达式结束后就消亡了&#xff0c;如果想继续使用右值&#xff0c;那就会动用昂贵的拷贝构造函数。&#xff08;关…

k8s 进阶实战笔记 | NFS 动态存储类的部署与使用

文章目录 NFS 动态存储类的部署与使用演示环境说明NFS subdir external provisioner准备 NFS 服务器手动部署 NFS Subdir External Provisioner部署 StorageClass验证使用更多信息 NFS 动态存储类的部署与使用 演示环境说明 演示环境信息&#xff1a;单机K3s 1.28.2 操作系统…

配置用户通过IPv6方式上网

组网需求 运营商为企业分配了WAN侧的IPv6地址1111:2222:A0EE:6::2/64和LAN侧的IPv6地址1111:3333:E840:2::1/64&#xff0c;企业通过运营商提供的IPv6地址配置上网。 图1 配置用户通过IPv6方式上网 操作步骤 1、在IPS上的配置 interface GigabitEthernet0/0/4 ipv6 enable…

代码随想录Leetcode377. 组合总和 Ⅳ

题目&#xff1a; 代码(首刷看解析 2024年2月27日&#xff09;&#xff1a; class Solution { public:// 思路&#xff1a;动态规划int combinationSum4(vector<int>& nums, int target) {// 1条件判断:无// 2定义dp 初始化 总和为target的数量vector<int> dp…