单调栈 (Monotone-Stack) 及经典问题

单调栈

单调栈:不从头部出的单调队列

总结
单调队列:擅长维护区间【最大/最小】值,最小值对应单调递增队列
单调栈:擅长维护最近【大于/小于】关系
从左侧先入栈,就是维护左侧最近关系
从右侧先入栈,就是维护右侧最近关系

int main(){int n;cin>>n;vector<int> arr(n);vector<int> pre(n), nxt(n);stack<int> s;for(int i = 0, a;i < n; ++i) cin >> arr[i];for(int i = 0; i < n; i++){while(s.size() && arr[i] < arr[s.top()]){nxt[s.top()] = i;s.pop();}if(s.size() == 0) pre[i] = -1;else pre[i] = s.top();s.push(i);}while(s.size()) nxt[s.top()] = n, s.pop();return 0;
}

单调栈基础题目

155. 最小栈

class MinStack {
public:stack<int> s, min_s;MinStack() {}void push(int val) {s.push(val);if(min_s.size() == 0 || val <= min_s.top()){min_s.push(val);}return;}void pop() {if(s.top() == min_s.top()) min_s.pop();s.pop();return;}int top() {return s.top();}int getMin() {return min_s.top();}
};

503. 下一个更大元素 II

class Solution {
public:vector<int> nextGreaterElements(vector<int>& nums) {stack<int> s;vector<int> ret(nums.size());for(int i = 0; i < nums.size(); i++) ret[i] = -1;for(int i = 0; i < nums.size(); i++){while(s.size() && nums[i] > nums[s.top()]){ret[s.top()] = nums[i];s.pop();}s.push(i);}for(int i = 0; i < nums.size(); i++){while(s.size() && nums[i] > nums[s.top()]){ret[s.top()] = nums[i];s.pop();}s.push(i);}return ret;}
};

901.股票价格跨度

class StockSpanner {
public:typedef pair<int, int> PII;int t;stack<PII> s;StockSpanner() {t = 0;s.push(PII(INT_MAX, t++));}int next(int price) {while(s.size() && price >= s.top().first) s.pop();int ret = t - s.top().second;s.push(PII(price, t++));return ret;}
};

739. 每日温度

class Solution {
public:vector<int> dailyTemperatures(vector<int>& temperatures) {vector<int> ret(temperatures.size());stack<int> s;for(int i = 0; i < temperatures.size(); ++i){while(s.size() && temperatures[i] > temperatures[s.top()]){ret[s.top()] = i - s.top();s.pop();}s.push(i);}return ret;}
};

84. 柱状图中最大的矩形

class Solution {
public:int largestRectangleArea(vector<int>& heights) {stack<int> s;vector<int> l(heights.size()), r(heights.size());int n = heights.size();for(int i = 0; i < n; i++) l[i] = -1, r[i] = n;for(int i = 0; i < n; i++) {while(s.size() && heights[i] <= heights[s.top()]){r[s.top()] = i;s.pop();}if(s.size()) l[i] = s.top();s.push(i);}int ans = 0;for(int i = 0; i < n; i++){ans = max(ans, heights[i] * (r[i] - l[i] - 1));}return ans;}
};

1856. 子数组最小乘积的最大值

class Solution {
public:int maxSumMinProduct(vector<int>& nums) {stack<int> s;vector<int> l(nums.size()), r(nums.size());int n = nums.size();for(int i = 0; i < n; i++) l[i] = -1, r[i] = n;for(int i = 0; i < n; i++) {while(s.size() && nums[i] <= nums[s.top()]){r[s.top()] = i;s.pop();}if(s.size()) l[i] = s.top();s.push(i);}vector<long long> sum(n + 1);sum[0] = 0;for(int i = 0; i < n; i++) sum[i + 1] = sum[i] + nums[i];long long ans = 0;for(int i = 0; i < n; i++){ans = max(ans, nums[i] * (sum[r[i]] - sum[l[i] + 1]));}return ans % (long long)(1e9 + 7); }
};

907. 子数组的最小值之和

class Solution {
public:int sumSubarrayMins(vector<int>& arr) {stack<int> s;int mod_num = 1e9 + 7;long long ans = 0;vector<long long> sum(arr.size() + 1);sum[0] = 0;for(int i = 0; i < arr.size(); i++){while(s.size() && arr[i] <= arr[s.top()]) s.pop();int ind = s.size() ? s.top() : -1;s.push(i);sum[s.size()] = (sum[s.size() - 1] + arr[i] * (i - ind)) % mod_num;ans += sum[s.size()];ans %= mod_num;}return ans;}
};

496. 下一个更大元素 I

class Solution {
public:vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {unordered_map<int, int> h;stack<int> s;for(auto x: nums2){while(s.size() && x > s.top()){h[s.top()] = x;s.pop();}s.push(x);}vector<int> ret(nums1.size());for(int i = 0; i < nums1.size(); i++){if(h.find(nums1[i]) == h.end()) ret[i] = -1;else ret[i] = h[nums1[i]]; }return ret;}
};

456. 132 模式

  • 假设当前元素是中间的最大值,那么需要向前寻找小于他的最小值和向后找大于他的最大值,进行比较看是否符合条件
class Solution {
public:bool find132pattern(vector<int>& nums) {vector<int> l(nums.size());l[0] = INT_MAX;for(int i = 1; i < nums.size(); i++) l[i] = min(l[i - 1], nums[i - 1]);stack<int> s;for(int i = nums.size() - 1; i >= 0; --i){int val = nums[i] + 1;while(s.size() && nums[i] > s.top()) val = s.top(), s.pop();s.push(nums[i]);if(l[i] < nums[i] && val < nums[i] && val > l[i]) return true;}return false;}
};

42. 接雨水

class Solution {
public:int trap(vector<int>& height) {int ans = 0;stack<int> s;for(int i = 0; i < height.size(); i++){while(s.size() && height[i] > height[s.top()]){int now = s.top();s.pop();if(s.size() == 0) continue;int a = height[i] - height[now];int b = height[s.top()] - height[now];ans += (i - s.top() - 1) * min(a, b);}s.push(i);}return ans;}
};

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

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

相关文章

Python解析姓名自动生成邮箱

现在很多公司都会有属于自己公司的专属邮箱。但是邮箱重复确实一个很麻烦的事情。 业务需求如下&#xff1a; 自动解析姓名为拼音姓和拼音名&#xff0c;由拼音姓和拼音名组装一个邮箱&#xff0c;如果组装的邮箱重复则需要加上数字&#xff0c;数据累计向上。from xpinyin i…

JavaScript 之 toString()方法详解

一、简介 ​ 在 JavaScript 中&#xff0c;toString() 方法是很多数据类型内置的方法&#xff0c;它被用于将特定的数据类型转换为字符串。但是在不同的数据类型中的作用并非完全相同&#xff0c;下面就来详细讲解一下 toString() 方法在各种数据类型中的使用和作用。 二、详…

element-ui组件DatePicker日期选择器移动端兼容

element-ui组件DatePicker日期选择器移动端兼容 css /** 移动端展示 **/ media screen and (max-width: 500px) {.el-picker-panel__sidebar {width: 100%;}.el-picker-panel {width: 400px!important;}.el-picker-panel__content {width: 100%;}.el-picker-panel__body{marg…

初识MySQL

一、什么是数据库 数据库&#xff08;Database&#xff0c;简称DB&#xff09;&#xff1a;长期存放在计算机内&#xff0c;有组织、可共享的大量数据的集合&#xff0c;是一个数据“仓库”。 数据库的作用&#xff1a; 可以结构化存储大量的数据&#xff0c;方便检索和访问…

U盘如何设置密码?U盘数据该怎么加密?

U盘等移动储存设备可以存储很多重要文件&#xff0c;方便我们随时使用。为了避免数据泄露&#xff0c;我们需要加密保护U盘数据。那么&#xff0c;U盘数据该怎么加密呢&#xff1f;下面我们就来了解一下。 U盘数据加密保护的必要性 目前&#xff0c;大多数的U盘并不具备数据加…

rhino犀牛怎么导入和调整背景图?

rhino犀牛怎么导入和调整背景图&#xff1f;Rhino建模过程中经常要用到背景图&#xff0c;为了更加方便快捷&#xff0c;我们会直接导入一些图片来当做背景&#xff0c;那么Rhino犀牛如何导入和调整背景图呢&#xff0c;让我们一起来看看吧 打开犀牛软件&#xff0c;进入操作界…

oracle用户密码过期导致cron失败

有客户反馈&#xff0c;有个测试环境很久不做自动备份。登录环境查看&#xff0c;发现oracle用户过期导致&#xff0c;如下 [roothydb ~]# su - oracle Last login: Wed Jan 3 10:19:40 CST 2024 on pts/0 orcl:/home/oraclehydb> crontab -l You (oracle) are not allow…

分布式数据之复制(Replication)

1.简介 1.1简介——使用复制的目的 在分布式系统中&#xff0c;数据通常需要被分散在多台机器上&#xff0c;主要为了达到以下目的&#xff1a; 扩展性&#xff0c;数据量因读写负载巨大&#xff0c;一台机器无法承载&#xff0c;数据分散在多台机器 上可以有效地进行负载均衡…

圣诞节来临,如何用海外云手机给亚马逊店铺引流?

马上就要到圣诞节了&#xff0c;这是一年中冲刺销售量的最后一个好机会&#xff0c;对所有亚马逊卖家都十分重要。而无论是亚马逊新手卖家还是老卖家&#xff0c;要想在激烈的竞争中取胜&#xff0c;仅仅靠产品本身是不现实的&#xff0c;通过测评和社媒引流获取更多曝光和流量…

LLM Agent之再谈RAG的召回信息密度和质量

话接上文的召回多样性优化&#xff0c;多路索引的召回方案可以提供更多的潜在候选内容。但候选越多&#xff0c;如何对这些内容进行筛选和排序就变得更加重要。这一章我们唠唠召回的信息密度和质量。同样参考经典搜索和推荐框架&#xff0c;这一章对应排序重排环节&#xff0c;…

大白话说区块链和通证

1 区块链 简单地说&#xff0c;区块链其实就像是一个不可篡改的分布式数据库&#xff0c;该分布式数据库记录了一系列交易或事件。区块链运行在至少1个以上的节点上&#xff0c;每个节点都有自己的一个分布式数据库&#xff0c;也就是分布式账本。正常情况下&#xff0c;每个节…

C 练习实例19

题目&#xff1a;一个数如果恰好等于它的因子之和&#xff0c;这个数就称为"完数"。例如61&#xff0b;2&#xff0b;3.编程找出1000以内的所有完数。 程序分析&#xff1a;请参照&#xff1a;C 练习实例14。 步骤分析&#xff1a; 写一个函数判断是否是完数 找出…

软文写作三大原则与技巧,媒介盒子分享

网络技术的快速发展带来传播环境的巨变&#xff0c;软文已经成为各大企业宣传的主要形式之一。而软文广告的核心就是其文案&#xff0c;一个好的软文不仅能够传达品牌理念&#xff0c;还能吸引用户了解品牌&#xff0c;提高转化率&#xff0c;今天媒介盒子就来和大家聊聊软文写…

二叉树的直径,力扣

目录 题目地址&#xff1a; 题目&#xff1a; 我们直接看题解吧&#xff1a; 审题目事例提示&#xff1a; 解题方法&#xff1a; 难度分析&#xff1a; 解题方法分析&#xff1a; 解题分析&#xff1a; 补充说明&#xff1a; 代码优化&#xff1a; 题目地址&#xff1a; 543. 二…

Minitab 20安装包下载及安装教程

Minitab 20下载链接&#xff1a;https://docs.qq.com/doc/DUmNYVGxtUnZkWUpk 1.选中下载好的安装包&#xff0c;鼠标右键解压到”Minitab 20“文件夹 2.选中Setup&#xff0c;鼠标右击选择“以管理员身份运行” 3.点击“下一步” 4.点击“下一步” 5.勾选我接受许可协议中的条…

wblogic中间件配置数据源

配置数据源 1.服务-数据源-配置-新建 2.单机选一般数据源 3.选择源名称、jndi名称、数据库类型 4.选择驱动 5.下一步 6.输入连接串信息 参考&#xff1a; 格式二&#xff1a;jdbc:oracle:thin:<host>:<port>:<SID> 数据库名称配置的sid 7.测试配置&#xff…

CEC2017(Python):七种算法(RFO、DBO、HHO、SSA、DE、GWO、OOA)求解CEC2017

一、7种算法简介 1、红狐优化算法RFO 2、蜣螂优化算法DBO 3、哈里斯鹰优化算法HHO 4、麻雀搜索算法SSA 5、差分进化算法DE 6、灰狼优化算法GWO 7、鱼鹰优化算法OOA 二、CEC2017简介 参考文献&#xff1a; [1]Awad, N. H., Ali, M. Z., Liang, J. J., Qu, B. Y., &…

MINCO+汽车

对于环境中的静态障碍物&#xff0c;我们构造几何自由空间来约束自我车辆的完整模型以保证安全。 对于动态障碍物&#xff0c;我们使用凸多边形来覆盖其形状。 然后&#xff0c;我们约束小车与障碍物多边形在每一时刻的符号距离[1]的下界近似&#xff0c;以保证小车的安全。 …

macOS进程间通信的常用技术汇总

macOS进程间通信的常用技术汇总 命令行传参。yyds管道(pipe), 匿名管道&#xff0c; c的技术&#xff0c;可以跨平台使用 只能在父子进程间通信&#xff0c;由于是单向的管道&#xff0c;只能单方面传输数据。 如果需要双向传输&#xff0c;需要建立双向的两条管道才行 匿名管…

Pointnet++改进注意力机制系列:全网首发CoordAtt注意力机制 |即插即用,实现有效涨点

简介:1.该教程提供大量的首发改进的方式,降低上手难度,多种结构改进,助力寻找创新点!2.本篇文章对Pointnet++特征提取模块进行改进,加入CoordAtt注意力机制,提升性能。3.专栏持续更新,紧随最新的研究内容。 目录 1.理论介绍 2.修改步骤 2.1 步骤一 2.2 步骤二