其他分享
首页 > 其他分享> > 单调栈/单调队列

单调栈/单调队列

作者:互联网

单调栈,单调队列

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

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

                                                单调栈

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

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

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

下面是一道模板题

 

 

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