单调栈/单调队列
作者:互联网
单调栈,单调队列
看名字他们有有一个共同的特点,那就是——单调
因为它们“单调”,所以单调栈和单调队列,他们存储的数据都是有序的,只会递增或递减。
单调栈
单调栈分为单调递增栈和单调递减栈
单调递增栈:从栈底到栈顶数据从小到大
单调递减栈:从栈底到栈顶数据从大到小
下面是一道模板题
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) 的值。
输入输出样例
输入 #15 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