代码随想录算法训练营刷题复习4 :单调栈

单调栈

单调栈
如果题目出现典型的
【左小 中大(栈中左侧元素都比此值小) || 右小】(寻找右侧第一个比此值小的元素)
【左大 中小(栈中左侧元素都比此值大) || 右大】(寻找右侧第一个比此值大的元素)
数据关系的话,可以考虑使用单调栈解决问题

  1. 739. 每日温度

  2. 496. 下一个更大元素 I

  3. 503. 下一个更大元素 II

  4. 42. 接雨水

  5. 84. 柱状图中最大的矩形这个题忽略了对数组头和尾添加0以方便对头和尾元素的处理

4、5这两个题可以总结为单调栈中求面积问题:找所求区域的高和宽

739. 每日温度

class Solution {
public:vector<int> dailyTemperatures(vector<int>& temperatures) {if(temperatures.size()<=1)return vector<int>(0);//需要用到栈和数组stack<int> st;vector<int> result(temperatures.size(),0);// 初始化把第一个元素的下标入栈st.push(0);for(int i=1;i<temperatures.size();i++) {//栈顶的元素值与当前遍历的值作比较if(temperatures[i] <= temperatures[st.top()]) {st.push(i);}else {//遇到第一个比当前值大的值时,用while循环来循环处理while(!st.empty() && temperatures[i] > temperatures[st.top()]){result[st.top()] = i-st.top();st.pop();}//处理结束说明栈中已经没有比当前遍历元素还小的值了,就把i入栈st.push(i);}}return result;}
};

496. 下一个更大元素 I

class Solution {
public:vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {unordered_map<int,int> umap;//想要存 <键值,下标>这个关系// 下文中需要判断nums2中的值是否在nums1中出现,下标零出现误判,故使用i+1for(int i=0;i<nums1.size();i++) {umap[nums1[i]]=i+1;}if(nums1.size()==0 || nums2.size()==0)return vector<int>(nums1.size(),-1);stack<int> st;vector<int> ans(nums1.size(),-1);//这个数据没必要存了其实// vector<int> temp(nums2.size(),-1);st.push(0);for(int i=1;i<nums2.size();i++) {if(nums2[i] <= nums2[st.top()]) {st.push(i);}else {while(!st.empty() && nums2[i] > nums2[st.top()]) {// temp[st.top()] = nums2[i];if(umap[nums2[st.top()]]!=0) {ans[umap[nums2[st.top()]] -1] = nums2[i];}st.pop();}st.push(i);}}return ans;}
};

503. 下一个更大元素 II

class Solution {
public:vector<int> nextGreaterElements(vector<int>& nums) {//通过复制数组,将循环问题转化为不循环问题vector<int> nums1(nums.begin(),nums.end());// insert函数参数需要,插入位置,以及插入的元素范围nums.insert(nums.end(),nums1.begin(),nums1.end());stack<int> st;vector<int> res(nums.size(),-1);st.push(0);for(int i=1;i<nums.size();i++) {if(nums[i]<=nums[st.top()]) {st.push(i);}else {while(!st.empty() && nums[i]>nums[st.top()] ) {res[st.top()] = nums[i];st.pop();}st.push(i);}}//恢复原先数组大小res.resize(nums.size()/2);return res;}
};

42. 接雨水

class Solution {
public:int trap(vector<int>& height) {if(height.size()<=2)return 0;stack<int> st;// vector<int> res(height.size(),0);st.push(0);int result = 0;for(int i=1;i<height.size();i++) {if(height[i] < height[st.top()]) {st.push(i);}else if(height[i] == height[st.top()]) {st.pop();st.push(i);}else {while(!st.empty() && height[i] > height[st.top()]) {int mid = st.top();st.pop();if(!st.empty()){int left = st.top();int w = i-left-1;int h = min(height[i],height[st.top()])-height[mid];result+=h*w;}}st.push(i);}}return result;}
};

84. 柱状图中最大的矩形

class Solution {
public:int largestRectangleArea(vector<int>& heights) {if(heights.size()==0)return 0;if(heights.size()==1)return heights[0];//这里对原始数组的头尾添加0值忘记考虑了heights.insert(heights.begin(),0);heights.push_back(0);stack<int> st;int res=0;st.push(0);for(int i=1;i<heights.size();i++) {if(heights[i]>heights[st.top()])st.push(i);else if(heights[i] == heights[st.top()]) {st.pop();st.push(i);}else {while(!st.empty() && heights[i]< heights[st.top()]) {int mid = st.top();st.pop();if(!st.empty()) {int left = st.top();int w = i-left-1;res = max(res,w*heights[mid]);}}st.push(i);}}return res;}
};

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

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

相关文章

Marin说PCB之orcad-capture原理图封装库的创建总结----01

今天是个不错的日子&#xff0c;我早上一出门刚骑车到半路就开始下大雨了&#xff0c;可是天气预报上明明说的没有雨啊&#xff0c;所以说天气预报就像是女人的脾气一样&#xff0c;难以揣摩啊&#xff0c;也尽量少去揣摩吧。 小编我刚刚到公司&#xff0c;就收到美国分部同事J…

【C语言】排序算法 -------- 计数排序

个人主页 创作不易&#xff0c;感谢大家的关注&#xff01; 文章目录 1. 计数排序的概念2. 计数排序使用场景3. 计数排序思想4. 计数排序实现过程5. 计数排序的效率6. 总结&#xff08;附源代码&#xff09; 1. 计数排序的概念 计数排序是一种非比较的排序算法&#xff0c;其…

分享三款AI智能修图工具,超实用!

随着AI技术的飞速发展&#xff0c;图像处理领域正经历着一场颠覆性的革新。如今&#xff0c;众多繁琐的图像处理任务&#xff0c;诸如修图、抠图以及高清修复等&#xff0c;均可以借助先进的AI技术实现自动化处理。相较于传统的人工操作&#xff0c;AI图像工具不仅极大地提升了…

3d中毒了打不开模型怎么办---模大狮模型网

3D中毒了打不开模型怎么办&#xff1f;这是很多3D爱好者都会遇到的问题。在使用3D建模软件时&#xff0c;有时会出现打不开模型的情况&#xff0c;这可能是由于软件本身的问题&#xff0c;也可能是由于电脑配置不够高导致的。下面我们就来看看如何解决这个问题。 首先&#xff…

新手学习yolov8目标检测小记1

一、复现 网上有很多教程&#xff0c;复现yolov8的目标检测。在复现的过程中&#xff0c;会用到模型yolov8n.pt&#xff0c;可以选择命令下载和网站下载。复现后&#xff0c;runs文件包下会生成最优的权重文件best.py&#xff0c;在ultralytics/assets中放一张图片&#xff0c;…

探索未来通信的新边界:AQChat一款融合AI的在线匿名聊天

探索未来通信的新边界&#xff1a;AQChat一款融合AI的在线匿名聊天 在数字时代&#xff0c;即时通讯变得无处不在&#xff0c;但隐私和性能仍旧是许多用户和开发者关注的焦点。今天&#xff0c;我要介绍一个开创性的开源项目 —— AQChat&#xff0c;它不仅重定义了在线匿名聊…

Ollama+Open WebUI本地部署Llama3 8b(附踩坑细节)

先展示一下最终结果&#xff0c;如下图所示&#xff1a; 1. 添加环境变量 在下载 ollama 之前&#xff0c;先去配置环境变量&#xff0c;确保模型下载到我们想要的地方 win10 和 win11 输入path或者环境变量&#xff1a; 增加系统环境变量 变量名不可更改&#xff0c;必须是O…

[ARM-2D 专题]3. ##运算符

C语言的宏系统相当强大&#xff0c;它允许使用##符号来处理预处理期的文本替换。这种用法被称为标记连接&#xff08;token pasting&#xff09;操作&#xff0c;其结果是将两个标记紧紧地连接在一起&#xff0c;而省略掉它们之间的所有空格。在复杂的宏定义中&#xff0c;运用…

学习使用js实现导出excel表格导出csv表格的方法示例,并支持中文汉字

学习使用js实现导出excel表格导出csv表格的方法示例 <!DOCTYPE html> <html> <head><meta charset"utf-8"><title>下载表格</title></head> <body><script type"application/javascript">function …

Debian/Ubuntu linux安装软件

1、官方软件商店安装 2、deb包安装 报错不是sudoers&#xff0c;首先将用户添加到sudo su -l adduser USERNAME sudo exit然后&#xff0c;退出桌面环境并再次登录。 您可以通过输入以下内容来检查上述过程是否成功&#xff1a; groups下载deb包 altshiftf4或右键打开命令行…

10.无代码爬虫软件做网页数据抓取流程——工作流程设置与数据预览

首先&#xff0c;多数情况下免费版本的功能&#xff0c;已经可以满足绝大多数采集需求&#xff0c;想了解八爪鱼采集器版本区别的详情&#xff0c;请访问这篇帖子&#xff1a;https://blog.csdn.net/cctv1123/article/details/139581468 八爪鱼采集器免费版和个人版、团队版下…

安卓实现输入快递单号生成二维码,摄像头扫描快递单号生成的二维码,可以得到快递信息

背景&#xff1a; 1、实现二维码的生成和识别2、实现andriod&#xff08;或虚拟机&#xff09;部署&#xff0c;调用摄像头3、实现网络管理&#xff0c;包括数据库【取消】2、3可以组队实现&#xff0c;1必须单人实现 过程&#xff1a; 安卓APP主界面 输入快递单号信息&#…

HTML页面定时刷新指南

在Web开发中&#xff0c;有时我们需要定时刷新页面&#xff0c;以确保用户总是看到最新的数据。HTML提供了一种简单的方式来实现这一点&#xff0c;那就是使用<meta>标签的http-equiv属性。 什么是<meta>标签&#xff1f; <meta>标签是HTML文档的头部&…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 剩余银饰的重量(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 📎在线评测链接 剩余银饰的重量(100分) 🌍 评测功能需要订阅专栏后私信联系…

关于伪标头那些事

前言 看到伪标头&#xff0c;不少同学可能会比较陌生&#xff0c;因为谁让它默默无闻呢&#xff1f; 当然博主把它比喻为一个来自传输层的“共享盒子”。提到共享&#xff0c;我想大家有所体会了。这里给大家贴一张直观的图例&#xff0c;可以静静观摩之。 Q&#xff1a;什么是…

MFC扩展库BCGControlBar Pro v35.0新版亮点:重新设计的工具栏编辑器等

BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。 我们的组件可以轻松地集成到您的应用程序中&#xff0c;并为您节省数百个开发和调试时间。 BCGControlBar专业版 v35.0已全新发布了&#xff0c;这个版本改进类Visual Studio 2022的视觉主题、增强对多个…

网络安全:SQL注入防范

文章目录 网络安全&#xff1a;SQL注入防范引言防范措施概览使用参数化查询示例代码 输入验证和过滤示例代码 使用ORM框架示例代码 其他防范措施结语 网络安全&#xff1a;SQL注入防范 引言 在上一篇文章中&#xff0c;我们介绍了SQL注入攻击的基础知识。本文将重点讨论如何防…

Redis 的分布式 Session 与本地 Session 的区别

在线工具站 推荐一个程序员在线工具站&#xff1a;程序员常用工具&#xff08;http://cxytools.com&#xff09;&#xff0c;有时间戳、JSON格式化、文本对比、HASH生成、UUID生成等常用工具&#xff0c;效率加倍嘎嘎好用。 程序员资料站 推荐一个程序员编程资料站&#xff1a;…

python字符串通过切片方式去掉最后一个字符

在Python中&#xff0c;你可以使用切片&#xff08;slicing&#xff09;来去掉字符串的最后一个字符。字符串的切片是通过使用冒号:分隔的索引来完成的&#xff0c;格式为[start:stop:step]。如果你想要去掉最后一个字符&#xff0c;你可以使用索引-1&#xff08;表示最后一个字…

C++之函数重载

函数重载概念&#xff1a; 是函数的一种特殊情况&#xff0c; C 允许在 同一作用域中 声明几个功能类似 的同名函数 &#xff0c;这 些同名函数的 形参列表(参数个数 或 类型 或 类型顺序)不同 &#xff0c;常用来处理实现功能类似数据类型 不同的问题。 #include<iostre…