首页 > 其他分享 >单调栈 详解+例题

单调栈 详解+例题

时间:2024-09-22 14:13:49浏览次数:6  
标签:出栈 入栈 int 元素 栈顶 详解 例题 单调

昨天打 AT 碰到了一道单调栈的题,于是来复习一下

单调栈

栈内元素单调性
单调递增栈单调递减栈

实现:

举个例子:

假设入栈序列为

1 4 2 8 9 3

要模拟一个单调递增栈:

  • \(i=1\) 时,栈为空,\(1\) 入栈后仍然保持单调性,将 \(1\) 入栈;
  • \(i=2\) 时,栈顶元素为 \(1\),\(4\) 入栈后仍然保持单调性,将 \(4\) 入栈;
  • \(i=3\) 时,栈顶元素为 \(4\),\(2\) 入栈后不满足单调性,\(4\) 出栈。
    此时 \(2\) 入栈后能保持单调性,\(2\) 入栈;
  • \(i=4\) 时,栈顶元素为 \(2\),\(8\) 入栈后仍然保持单调性,将 \(8\) 入栈;
  • \(i=5\) 时,栈顶元素为 \(8\),\(9\) 入栈后仍然保持单调性,将 \(9\) 入栈;
  • \(i=6\) 时,栈顶元素为 \(9\),\(3\) 入栈后不满足单调性,\(9\)出栈。
    这时栈顶元素为 \(8\),\(3\) 入栈后不满足单调性,\(8\)出栈。
    此时 \(3\) 入栈后能保持单调性,\(3\) 入栈;

代码:

stack<int>st;//栈里面存下标 

for(int i=1;i<=n;i++)
{
	while(!st.empty()&&a[st.top()]>a[i])//a[i]入栈后不是单调递增的
		st.pop();//出栈
	……//更新答案 
	st.push(i); 
}

那它有什么用呢?

洛谷模板题

题目大意:

给你一个数列 \(a\),求数列中第 \(i\) 个元素后面第一个大于它的元素的下标

思路:

  • 思路一:建立一个单调递减的栈
    按照顺序入栈
    如果一个数入栈就不满足单调递减了,证明这个数是目前栈顶的元素后面第一个大于它的元素的下标
    记录答案
  • 思路二:建立一个单调递减的栈
    倒序入栈
    如果一个数入栈就不满足单调递减了,栈顶出栈
    最后栈顶就是此时入栈元素后面第一个大于它的元素的下标
    记录答案

完整代码:

思路一:

#include<bits/stdc++.h>

using namespace std;

int n;
int a[3000100];
int f[3000100];
stack<int>st;

int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	for(int i=1;i<=n;i++)
	{
		while(!st.empty()&&a[st.top()]<a[i]){
			f[st.top()]=i;
			st.pop();
		}
		st.push(i);
	}
	for(int i=1;i<=n;i++)
	{
		cout<<f[i]<<(i!=n?" ":"\n");
	}
	return 0;
}

思路二:

#include<bits/stdc++.h>

using namespace std;

int n;
int a[3000100];
stack<int>st;
int f[3000100];

int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	 } 
	for(int i=n;i>=1;i--)
	{
		while(!st.empty()&&a[st.top()]<=a[i]) st.pop();
		if(!st.empty())f[i]=st.top();//这里要特别判断一下是否为空
		else f[i]=0;
		st.push(i);
	}
	for(int i=1;i<=n;i++)
	{
		cout<<f[i]<<(i!=n?" ":"\n");
	}
	return 0;
}

例题:

https://www.luogu.com.cn/problem/P2866
https://www.luogu.com.cn/problem/P2947
https://atcoder.jp/contests/abc372/tasks/abc372_d

完结撒花!

标签:出栈,入栈,int,元素,栈顶,详解,例题,单调
From: https://www.cnblogs.com/lazy-ZJY0307/p/18425229

相关文章

  • QT 3D渲染技术详解
    QT3D渲染技术详解使用AI技术辅助生成QT界面美化视频课程QT性能优化视频课程QT原理与源码分析视频课程QTQMLC++扩展开发视频课程免费QT视频课程您可以看免费1000+个QT技术视频免费QT视频课程QT统计图和QT数据可视化视频免费看免费QT视频课程QT性能优化视频免费看免......
  • Java面向对象——内部类(成员内部类、静态内部类、局部内部类、匿名内部类,完整详解附有
    文章目录内部类17.1概述17.2成员内部类17.2.1获取成员内部类对象17.2.2成员内部类内存图17.3静态内部类17.4局部内部类17.5匿名内部类17.5.1概述内部类17.1概述写在一个类里面的类叫内部类,即在一个类的里面再定义一个类。如,A类的里面的定义B类,B类就称内部类......
  • 详解机器学习经典模型(原理及应用)——随机森林
    一、什么是随机森林        随机森林(RandomForest)是一种集成学习方法(EnsembleLearning),它通过构建多个决策树(决策树原理及应用可参考此处)并将它们的结果结合起来,以提高预测的准确性和稳定性(就是多棵树构成一片森林的意思)。与决策树一样,随机森林也是同时可以用于分类......
  • MySQL 数据库备份与恢复详解
    随着企业对数据依赖性的日益增加,确保数据库的安全与稳定至关重要。MySQL数据库作为开源数据库系统的代表,其备份与恢复能力直接关系到数据的安全性与业务的连续性。本文将结合最新的技术和工具,详细介绍MySQL的备份与恢复策略,帮助用户构建高效可靠的数据库管理方案。一、为什......
  • C++ | C++中与const相关的权限放大和缩小详解
    文章目录C++中与`const`相关的权限放大和缩小详解一、`const`的重要性及基本概念二、权限缩小(从非`const`到`const`)(一)指针的权限缩小(二)引用的权限缩小三、权限放大(从`const`到非`const`)(一)一般情况下的限制(二)通过特定类型转换进行权限放大四、注意事项C++中与const......
  • SAE ARP 4761A内容详解
    1.引言1.1文章背景与目的航空系统的安全性一直是航空工业中最为重要的课题之一。为了确保航空器及其子系统在各种环境和操作条件下的可靠性和安全性,制定了一系列国际标准和指南。这些标准不仅帮助航空制造商满足相关法律法规的要求,还为设计人员、工程师和运营商提供了结......
  • SAE ARP 4754A 标准详解
    一、引言1.1SAEARP4754A的背景随着航空技术的不断发展,现代民航飞机的系统变得越来越复杂。为了确保这些系统的安全性和可靠性,国际上制定了一系列的航空系统开发标准。SAEARP4754A是这些标准中的重要一部分,专注于指导航空系统的开发过程,特别是对于复杂集成系统的设......
  • Mobile net V系列详解 理论+实战(3)
    Mobilenet系列论文精讲部分0.摘要1.引文2.引文3.基础概念的讨论3.1深度可分离卷积3.2线性瓶颈3.3个人理解4.模型架构细节5.实验细节6.实验讨论7.总结论文精讲部分鉴于上一小节中采用的代码是V2的模型,因此本章节现对V2模型论文讲解,便于读者能够更好的使......
  • C++ -命名空间-详解
    博客主页:【夜泉_ly】本文专栏:【C++】欢迎点赞......
  • Dockerfile的详解与案例
    《Dockerfile详解与案例》一、Dockerfile简介Dockerfile是一个用来构建Docker镜像的文本文件,它包含了一系列指令,用于描述如何创建一个Docker镜像。通过Dockerfile,你可以定义镜像的基础环境、安装软件包、设置环境变量等操作,从而实现快速、可重复地构建容器镜像。......