[数据结构]---单调栈

这篇具有很好参考价值的文章主要介绍了[数据结构]---单调栈。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.单调栈定义:栈内元素按照递增(递减)顺序排列的栈。

单调栈分为单调递增栈单调递减栈

单调递增栈:从栈顶栈底数据是从小到大栈顶元素最小

单调递减栈:从栈顶栈底数据是从大到小栈顶元素最大

2.模拟实现一个单调递增栈:

有一组数8,3,6,12。从左到右依次入栈,如果栈为空入栈元素小于栈顶元素,入栈。

(1).8入栈时,栈为空,直接入栈,栈内元素为8.

(2).3入栈时,栈顶元素为8 > 3,入栈,栈内元素为8,3.

(3).6入栈时,栈顶元素为3 < 6, 则3出栈,此时栈顶元素为 8 > 6 ,则 6入栈,栈内元素为8,6

(4)12入栈时,栈顶元素为6 < 12,则6出栈,此时栈顶元素为 8 < 12,栈顶元素8继续出栈,此时栈为空,12入栈,栈内元素为12.

3.适用问题:

通常解决前后元素大小关系时使用单调栈。

4.例题:

(1).单调栈(【模板】单调栈 - 洛谷)

给出项数为 n 的整数数列 a1…n​。

定义函数 f(i) 代表数列中第 i个元素之后第一个大于 ai​ 的元素的下标,即 f(i)=mini<j≤n,aj​>ai​​{j}。若不存在,则 f(i)=0。

试求出 f(1…n)。

输入格式

第一行一个正整数 n。

第二行 n 个正整数 a1…n​。

输出格式

一行 n 个整数 f(1…n) 的值。

输入输出样例

输入 #1

5
1 4 2 3 5

输出 #1

2 5 4 5 0

说明/提示

【数据规模与约定】

对于 30% 的数据,n ≤ 100;

对于 60% 的数据,n ≤  5×10^3 ;

对于100% 的数据,1≤n≤3×10^6,1≤ai​≤10^9。

AC代码:

#include <iostream>
#include <algorithm>
#include <stack>

using namespace std;

const int N = 3 * 1e6 + 10; 
stack<int> v;		//存下标 
int a[N], f[N];		//a数组储存原数,f数组储存结果下标 

int main()
{
	std::ios::sync_with_stdio(false);		//加速,避免超时 
	int n;
	cin >> n;
	for(int i = 1; i <= n; i++ )
	cin >> a[i];
	for(int i = n; i >= 1; i-- )			//从后向前 
	{
		while(!v.empty() && a[v.top()] <= a[i] )	//栈不为空,栈顶元素比当前元素小,删除栈顶 
		v.pop(); 							
		f[i] = v.empty() ? 0 : v.top();		//栈为空,输出0,非空,栈顶即为答案元素下标 
		v.push(i);					//当前元素下标入栈 
	} 
	for(int i = 1; i <= n; i++ )			//正序输出 
	cout << f[i] <<" ";
	return 0;
}
 

(2).直方图中最大的矩形(131. 直方图中最大的矩形 - AcWing题库)

直方图是由在公共基线处对齐的一系列矩形组成的多边形。

矩形具有相等的宽度,但可以具有不同的高度。

例如,图例左侧显示了由高度为 2,1,4,5,1,3,3 的矩形组成的直方图,矩形的宽度都为 1:

什么是单调栈,数据结构,c++,算法

通常,直方图用于表示离散分布,例如,文本中字符的频率。

现在,请你计算在公共基线处对齐的直方图中最大矩形的面积。

图例右图显示了所描绘直方图的最大对齐矩形。

输入格式

输入包含几个测试用例。

每个测试用例占据一行,用以描述一个直方图,并以整数 n 开始,表示组成直方图的矩形数目。

然后跟随 n 个整数 h1,…,hn。

这些数字以从左到右的顺序表示直方图的各个矩形的高度。

每个矩形的宽度为 1。

同行数字用空格隔开。

当输入用例为 n=0时,结束输入,且该用例不用考虑。

输出格式

对于每一个测试用例,输出一个整数,代表指定直方图中最大矩形的区域面积。

每个数据占一行。

请注意,此矩形必须在公共基线处对齐。

数据范围

1≤n≤100000,
0≤hi≤1000000000文章来源地址https://www.toymoban.com/news/detail-726051.html

输入样例:
7 2 1 4 5 1 3 3
4 1000 1000 1000 1000
0
输出样例:
8
4000

 AC代码:

#include <iostream>
#include <algorithm>
#include <stack>

using namespace std;

typedef unsigned long long ull;
const int N = 1e5 + 10;
ull a[N],l[N],r[N];			//a存原数组,l存左边第一个比原数小的下标, r存右边第一个比原数小的下标
int n;

int main()
{
	while(cin >> n && n)
	{
		for(int i = 0; i < n; i++)
		cin >> a[i];
		stack<ull>s;
		ull ans = 0;
		a[n]=0;				//最后一个 
		s.push(-1);			//第一个 
		for(int i = 0; i <= n; i++)
		{
			while(!s.empty() && a[s.top()] > a[i])		//单调递减栈 
			{
				r[s.top()] = i;				//被弹出的即为右边第一个比原数小的元素,存下标 
				s.pop(); 
			}
			if(!s.empty())
			l[i] = s.top();		//左边第一个比原数小的元素下标即为栈顶元素下标 
			s.push(i);
		}
		for(int i = 0 ; i <= n; i++)
		{
			ans = max( ans, (ull)(r[i] - l[i] - 1) * a[i]);		//更新最大值 
		 } 
		cout << ans << endl;
	}
	return 0;
}

到了这里,关于[数据结构]---单调栈的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【算法与数据结构】1 算法0基础入门,详解什么是算法?什么是线性查找法?

    欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享,与更多的人进行学习交流 本文收录于算法与数据结构体系专栏, 本专栏 是服务于0基础者,一起完成从0到1的跨越 就是 一系列 可以解决问题的 清晰的 可执行的 计算机指令 那么生活中有哪些算法? 问路 :坐公交车到

    2023年04月09日
    浏览(54)
  • 数据结构与算法这么难,为什么我们还要学习?

    提到数据结构与算法,就一定会伴随着诸多所谓的坚持和抱怨。同时,还有两个词总是出现,一个是内功,是对知识的定位,一个是吃透,是对自己

    2024年01月19日
    浏览(57)
  • 【每日一题】补档 CF487B. Strip | 数据结构杂烩 -> 单调队列 | 困难

    原题链接 给定一个长度为 n n n 的数组,将这个数组进行拆分成若干个连续子数组, 使得每个子数组的最大值减去最小值小于等于 s s s , 且每个子数组的长度大于等于 l e n len l e n 。 问最少可以拆分成多少个连续子数组,如果不可以,则输出 − 1 -1 − 1 1 ≤ n , l e n ≤ 1 0

    2024年02月06日
    浏览(50)
  • C++11 数据结构0 什么是 “数据结构“?数据,数据对象,数据元素,数据项 概念。算法的基本概念 和 算法的度量,大O表示法,空间换时间的代码

    是能输入计算机且能被计算机处理的各种符号的集合。 数值型的数据:整数和实数。 非数值型的数据:文字、图像、图形、声音等。         性质相同的 \\\"数据元素\\\" 的集合         例如一个 int arr[10],  Teacher tea[3]; 数据元素:          tea[0],tea[1],arr[2],这些都是 数据项:

    2024年04月15日
    浏览(52)
  • 【大数据&AI人工智能】HBase的核心数据结构和算法原理是什么?给出代码实例

    HBase是一个开源的非关系型分布式数据库,它参考了Google的BigTable模型,实现语言为 Java。它是Apache软件基金会的Hadoop项目的一部分,运行在HDFS文件系统之上,为 Hadoop 提供类BigTable 的服务。 HBase的核心数据结构和算法原理是什么?给出代码实例。HBase的核心数据结构和算法原

    2024年02月09日
    浏览(57)
  • 【数据结构】什么是数据结构?

    🦄 个人主页 :修修修也 🎏 所属专栏 :数据结构 ⚙️ 操作环境 : Visual Studio 2022 目录 🎏数据结构的定义 🎏结语 数据结构(Data Structure)是计算机 存储 , 组织数据的方式 ,指 相互之间存在一种或多种特定关系的数据元素的集合 . 这么讲可能有些抽象,放一张图大家可能好理解一

    2024年02月07日
    浏览(52)
  • 算法 数据结构分类 数据结构类型介绍 数据结构线性非线性结构 算法合集 (一)

     数据结构分为:                            a.线性结构                            b.非线性结构  a.线性结构:                       数据与结构存在一对一的线性关系; a . 线性结构 存储 分为:                                   顺序存储

    2024年02月10日
    浏览(53)
  • 【算法与数据结构】--算法应用--算法和数据结构的案例研究

    一、项目管理中的算法应用 在项目管理中,算法和数据结构的应用涉及项目进度、资源分配、风险管理等方面。以下是一些案例研究,展示了算法在项目管理中的实际应用: 项目进度管理 : 甘特图算法 :甘特图是一种项目进度管理工具,它使用甘特图算法来展示项目任务

    2024年02月08日
    浏览(58)
  • 数据结构与算法设计分析—— 数据结构及常用算法

    1、顺序表与链表 线性表是 线性结构 ,是包含n个数据元素的有限序列,通过顺序存储的线性表称为 顺序表 ,它是将线性表中所有元素按照其逻辑顺序,依次存储到指定存储位置开始的一块连续的存储空间里;而通过链式存储的 链表 中,每个结点不仅包含该元素的信息,还

    2024年02月07日
    浏览(62)
  • 数据结构之数据结构要学什么,基本概念,三要素

          我从大二上学期的时候学了数据结构,但是当时对数据结构的重要性并不太重视,直到在升大三的暑假,才意识到数据结构对以后学语言和找工作方面的重要性,所以亡羊补牢,为时未晚,尝试着结合b站上王道考研数据结构课,来记录自己对知识和代码的理解。    

    2024年02月15日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包