代码随想录Day54

今天是国庆假期后的恢复做题的第一天,摆了那么久感觉还是有点没摆够哈哈哈哈!今天两道题都是困难题,两道题都去看讲解了,感觉这两道题是高度相似的,接雨水用单调递增栈来做,柱状图中最大的矩形用单调递减栈来做。

42. 接雨水

这道题还是延续之前的思路,用单调递增栈来做,即从栈顶到栈底为单调递增。雨水的体积就是这些柱子能够围成的凹槽的面积,遍历所有柱子,当遍历到的柱子高度小于等于栈顶的高度时,就将当前遍历到的柱子也压入栈中,这样符合单调递减栈的设计;当遍历到的柱子高度大于栈顶柱子的高度时,这就需要取出栈中的元素来计算结果了,先将栈顶元素用一个变量mid保存,再将栈顶元素弹出,该变量作为凹槽中的最底部,当前遍历的柱子作为凹槽中的右侧墙壁,弹出元素后新的栈顶元素作为凹槽中的左侧墙壁,如图所示。

当然这个计算过程是一个持续的过程,并不是计算一次就接着遍历下一根柱子了,考虑这么一种情况:输入数组为[8, 7, 6, 8],当遍历到最后一个8时触发计算条件,进入while循环,倘若没有while循环的话,计算一次结果后就会因为遍历完最后一根柱子而退出外层for循环,导致雨水量少算了。正确计算雨水的过程如图所示。

还有一个情况要考虑,就是在触发计算条件时,当把栈顶元素用mid保存后弹出时,需要立即判断栈是否为空,如果栈已经为空了,就说明下一步无法计算了,强行计算会报错,所以栈为空的话就直接将当前遍历到的柱子压入栈中即可。具体例子看下面这张图。

这种情况下是接不了雨水的,所以需要额外对栈是否为空进行判定。
这是代码

class Solution {
public:int trap(vector<int>& height) {int result = 0;stack<int> st;  //从栈顶到栈底是单调递增的st.push(0);for(int i = 1; i < height.size(); i++){if(height[i] <= height[st.top()])  //当前遍历元素小于等于栈顶元素,直接压入栈中st.push(i);else{  //当前遍历元素大于栈顶元素,开始计算雨水量while(!st.empty() && height[i] > height[st.top()]){int mid = st.top();st.pop();if(!st.empty()){ //栈不为空才进行下一步计算雨水操作,否则会越界访问报错int w = i - st.top() - 1;int h = min(height[i],  height[st.top()]) - height[mid];result += w * h;}                    }  st.push(i);}}return result;}
};

84.柱状图中最大的矩形

这道题的代码整体结构和上一题很像,这一题主要是用单调递减栈来做的,即栈顶到栈底单调递减,此外这里还有个小细节,就是这道题需要在原数组的首部和尾部插入0,具体后面会讲。
首先还是介绍一下触发计算条件时的一般计算过程,如下图所示。

计算矩形面积的时候,是以heights[mid]为高度,当前遍历到的柱子与新的栈顶中的柱子之间的间隔为宽的矩形来计算的。下面也再模拟一次持续计算的过程。考虑输入为[1, 2, 3, 2, 1],当遍历到第二个2时触发计算条件。如下图所示。

三个2拼接成面积为6的情况将在下一次外循环,即遍历到最后一个1时触发计算条件,这里不再赘述。
这里再解释下为什么要在数组的头部和尾部添0,这是因为输入的柱子都遍历完的情况下,还可能存在没有计算的情况,在上面那个例子中,当遍历到最后一个1时,触发计算条件,计算完下面的面积后,循环就终止了,但是高为1的情况被遗漏了。

尽管这种情况计算出来的面积不一定更大,但是这样的情况必须要考虑进去,所以需要在数组的首尾添0,用来触发这种情况的计算。其余的地方都和上一题没啥区别,无非是大于号与小于号互相颠倒。

class Solution {
public:int largestRectangleArea(vector<int>& heights) {//先将输入的数组首尾都添0heights.insert(heights.begin(), 0);heights.push_back(0);stack<int> st;   //从栈顶到栈底单调递减st.push(0);int result = 0;for(int i= 1; i < heights.size(); i++){if(heights[i] >= heights[st.top()])  //遍历到的元素大于等于当前栈顶元素,压入栈中st.push(i);else{  //遍历到的元素小于当前栈顶元素,开始计算矩形面积while(!st.empty() && heights[i] < heights[st.top()]){int mid = st.top();st.pop();if(!st.empty()){int w = i - st.top() - 1;int h = heights[mid];result = max(w * h, result);}}st.push(i);}}return result;}
};

今天是单调栈最后一天了,也是代码随想录视频系列的最后一节了,之后的题目就没有视频讲解了,感觉有点害怕😰

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

tcp/ip、以太网、mqtt、modbus/tcp复习

1.osi参考模型 2. modbus是应用层报文传输协议&#xff0c;没有规定物理层&#xff0c;只规定了协议帧&#xff0c;但是定义了控制器能够认识和使用的消息结构&#xff0c;不管它们是经过何种网络进行通信的&#xff0c;具有很强的适应性。 一主多从&#xff0c;同一时间主机…

【动态规划-最长公共子序列(LCS)】力扣1035. 不相交的线

在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。 现在&#xff0c;可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线&#xff0c;这些直线需要同时满足&#xff1a; nums1[i] nums2[j] 且绘制的直线不与任何其他连线&#xff08;非水平线&#xff09…

Rethinking Graph Neural Networksfor Anomaly Detection

AAAI24 推荐指数 #paper/⭐⭐ (由于这个领域初读&#xff0c;因此给的推荐分可能不好) 个人总结&#xff1a; 其在半监督&#xff08;1%&#xff0c;40%&#xff09;的情况下&#xff0c;使用多通滤波器&#xff0c;将不同滤波器得到的特征拼接起来&#xff0c;来做分类&…

【Blender Python】2.结合Kimi生成

概述 结合Kimi这样的AI工具可以生成Blender Python代码&#xff0c;用来辅助生成一些或简单或复杂的图形。当然&#xff0c;出不出错这就不一定了。因为AI所训练的版本可能并不是Blender的最新版本&#xff0c;类似的问题也出现在Godot上。 测试 在kimi中提问&#xff0c;获…

2024/10/6周报

文章目录 摘要Abstract广西的一些污水处理厂工艺解析1. A/O工艺&#xff08;厌氧-缺氧-好氧工艺&#xff09;2. 氧化沟工艺3. MBR工艺&#xff08;膜生物反应器&#xff09;4. SBR工艺&#xff08;序批式活性污泥法&#xff09;5. 生物接触氧化法 其它补充一体化改良氧化沟工艺…

LeetCode讲解篇之1143. 最长公共子序列

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 这题我们可以采用动态规划求解&#xff0c;用一个二维数组记录text1的0 ~ i区间子串和text2的0 ~ j区间子串的最长公共子序列的长度&#xff0c;我们假设该二维数组是f 这个数组有一个特性&#xff0c;如果a <…

会议时如何实现扫码签到?

如何实现扫码签到&#xff1f; 在现代活动管理中&#xff0c;签到环节是不可或缺的一部分。它不仅关系到活动的顺利进行&#xff0c;还涉及到参与者的体验。传统的签到方式往往耗时且效率不高&#xff0c;而随着技术的发展&#xff0c;扫码签到成为了一种高效且便捷的解决方案。…

如何在算家云搭建CosyVoice(文生音频)

一、CosyVoice简介 CosyVoice 是一个开源的超强 TTS&#xff08;‌文本转语音&#xff09;‌模型&#xff0c;‌它支持多种生成模式&#xff0c;‌具有极强的语音自然可控性。‌ 具有以下特点&#xff1a; 语音合成 &#xff1a;能够将文本转换为自然流畅的语音输出。多语种…

redis——哨兵机制

redis中提供了哨兵&#xff08;Sentinel&#xff09;机制来实现主从集群的自动故障恢复。 主从复制是实现redis高可用性的基石&#xff0c;从节点宕机时我们仍然可以将请求发送给主节点或者其他从节点&#xff0c;而当主节点宕机的时候&#xff0c;无法执行写操作&#xff0c;无…

百元头戴式耳机都有哪些值得入手?四款爆款高性价比机型推荐

在追求性价比的时代&#xff0c;选择一款既实惠又高品质的头戴式降噪耳机&#xff0c;成为了许多人的明智之举。它不仅能够为您带来出色的音质和降噪效果&#xff0c;还能让您在享受音乐的同时&#xff0c;节省不必要的开支。那百元头戴式耳机都有哪些值得入手&#xff1f;让我…

Mysql备份与恢复——日志

Mysql日志 Buffer Pool Innodb 存储引擎设计了一个缓冲池&#xff08;Buffer Pool&#xff09;&#xff0c;来提高数据库的读写性能。 Mysql中比较重要的日志包括&#xff1a;二进制日志 binlog&#xff08;归档日志&#xff09;和 redo log&#xff08;重做日志&#xff09;…

【买瓜 / F】

题目 思路 折半搜索 注意要从小到大排序&#xff08;虽然我也不知道为什么&#xff09; 代码 #include <bits/stdc.h> using namespace std; typedef long long ll; int n, m, t; int a[35]; unordered_map<ll, int> h; int ans INT_MAX; void dfs1(int k, int…

系统架构设计师-论文题(2021年下半年)

1.试题一 论面向方面的编程技术及其应用针对应用开发所面临的规模不断扩大、复杂度不断提升的问题&#xff0c;面向方面的编程Aspect Oriented Programming,AOP技术提供了一种有效的程序开发方法。为了理解和完成一个复杂的程序&#xff0c;通常要把程序进行功能划分和封装。一…

54.二叉树的最大深度

迭代 class Solution {public int maxDepth(TreeNode root) {if(rootnull){return 0;}int de0;Queue<TreeNode> qunew LinkedList<>();TreeNode tn;int le;qu.offer(root);while(!qu.isEmpty()){lequ.size();while(le>0){tnqu.poll();if(tn.left!null){qu.offe…

【Linux】Ubuntu20.04上使用RabbitVCS的图形化SVN

文章目录 1、RabbitVCS1.1、RabbitVCS 介绍1.2、RabbitVCS 主要功能1.3、Ubuntu下 TortoiseSVN 替代者 2、安装2.1、命令安装2.2、安装使用2.3、使用权限 3、解决SVN无法保存密码问题3.1、问题描述3.2、解决方法 1、RabbitVCS 1.1、RabbitVCS 介绍 它是一款Linux系统下的图形…

Excel中的屠龙大招

indirect的地位部分动摇&#xff0c;神坛下已初生大力骑士——“”。 (笔记模板由python脚本于2024年10月06日 18:57:11创建&#xff0c;本篇笔记适合同时喜欢python和Excel的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&…

李宏毅深度学习-自注意力机制

输入是向量序列的情况 在图像识别的时候&#xff0c;假设输入的图像大小都是一样的。但如果问题变得复杂&#xff0c;如图6.2所示&#xff0c;输入是一组向量&#xff0c;并且输入的向量的数量是会改变的&#xff0c;即每次模型输入的序列长度都不一样&#xff0c;这个时候应该…

DBMS-3.2 SQL(2)——DML的SELECT(含WHERE、聚集函数、GROUP BY、HAVING之间的关系)

本文章的素材与知识来自李国良老师和王珊老师。 数据操纵语言DML&#xff08;Data Manipulation Language&#xff09; SELECT 一.SELECT的语法与构成 1.语法 2.构成 二.投影 投影操作可以选择表中的若干列&#xff0c;主要体现在SELECT子句后的列表达式。 1.列表达式 2.…

鸿蒙开发(NEXT/API 12)【穿戴设备模板化通知】手机侧应用开发

手机侧应用向穿戴设备发送通知&#xff0c;并在穿戴设备上按模板显示&#xff0c;支持穿戴设备收到通知后同步振动或响铃&#xff08;跟随穿戴设备系统设置&#xff09;。执行成功后&#xff0c;穿戴设备上会显示下图所示通知界面。 该接口无需用户授权&#xff0c;仅需要确保…