单调栈/单调队列

单调栈,单调队列

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

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

                                                单调栈

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

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

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

下面是一道模板题

 

 

P5788 【模板】单调栈

题目背景

模板题,无背景。

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

题目描述

给出项数为 nn 的整数数列 a_{1 \dots n}a1n

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

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

输入格式

第一行一个正整数 nn。

第二行 nn 个正整数 a_{1\dots n}a1n

输出格式

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

输入输出样例

输入 #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:队尾

 



 

posted @   沉静的豆芽菜  阅读(56)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
点击右上角即可分享
微信分享提示