ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

单调栈/单调队列

2022-07-25 22:36:00  阅读:147  来源: 互联网

标签:下标 nn 队列 元素 栈顶 单调


单调栈,单调队列

看名字他们有有一个共同的特点,那就是——单调

因为它们“单调”,所以单调栈和单调队列,他们存储的数据都是有序的,只会递增或递减

                                                单调栈

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

单调递增栈:从栈底到栈顶数据从小到大

单调递减栈:从栈底到栈顶数据从大到小

下面是一道模板题

 

 

P5788 【模板】单调栈

题目背景

模板题,无背景。

2019.12.12 更新数据,放宽时限,现在不再卡常了。

题目描述

给出项数为 nn 的整数数列 a_{1 \dots n}a1…n​。

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

试求出 f(1\dots n)f(1…n)。

输入格式

第一行一个正整数 nn。

第二行 nn 个正整数 a_{1\dots n}a1…n​。

输出格式

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

输入输出样例

输入 #1
5
1 4 2 3 5
输出 #1     2 5 4 5 0 【思路】 本题的思路是用单调递减栈 由于输出的是下标,为了方便,在写单调栈的时候直接存入下标 a:原数组 ans[i]:a[i]的答案 s:栈 top:栈顶指针 从前往后遍历         重复执行n次,每次进行判断         如果栈不为空且当前进栈元素大于当前栈顶元素,ans[栈顶元素下标]=当前进栈下标,并将栈顶元素出栈(因为这是一个单调递减栈),重复执行判断,直到当前进栈元素小于等于当前栈顶元素          当当前进栈元素小于等于当前栈顶元素,则将当前进栈元素入栈 【代码】 【思路】 从前往后遍历 与从前往后遍历不同的是要存储一个单调递增栈

 

 单调队列

 单调队列也分为单调递增队列单调递减队列

单调递增队列:从队头到队尾的数据从小到大

单调递减队列:从队头到队尾的数据从大到小

下面是还是一道模板题

 

P1886 滑动窗口 /【模板】单调队列

题目描述

有一个长为 nn 的序列 aa,以及一个大小为 kk 的窗口。现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值。

例如:

The array is [1,3,-1,-3,5,3,6,7][1,3,−1,−3,5,3,6,7], and k = 3k=3。

输入格式

输入一共有两行,第一行有两个正整数 n,kn,k。 第二行 nn 个整数,表示序列 aa

输出格式

输出共两行,第一行为每次窗口滑动的最小值
第二行为每次窗口滑动的最大值

输入输出样例

输入 #1

   8 3

   1 3 -1 -3 5 3 6 7

输出 #1

-1 -3 -3 -3 3 3

3 3 5 5 6 7

【思路】

本题还是存储下标

q:单调队列

f:队头

r:队尾

 



 

标签:下标,nn,队列,元素,栈顶,单调
来源: https://www.cnblogs.com/pattont/p/16518522.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有