单调栈的分类
单调递增栈:栈中的元素从栈底到栈顶是单调递增的。不难发现,单调递增栈的出栈序列递减

单调递减栈:栈中的元素从栈底到栈顶是单调递减的。不难发现,单调递减栈的出栈序列递增

单调栈的应用
- 求数列中每个元素X的右边第一个大于元素X的新元素Y
- 求数列中每个元素X的左边第一个小于元素X的新元素Y
- 给一个数组,返回一个大小相同的数组,返回的数组的第
i个位置的值是对于原数组中的第i个元素,至少往右走多少步,才能遇到一个比自己大的元素 - 给一个数组,返回一个大小相同的数组,返回的数组的第
i个位置的值是对于原数组中的第i个元素,至少往左走多少步,才能遇到一个比自己小的元素 - 如果不存在,则输出-1
实例

上图的数组,对于每一个元素X,求解右边第一个大于X的元素,分别是3、4、5、9、9、-1、-1,保存在另一个数组res1中,如下图:

代码实现:
#include <iostream>
#include <stack>
using namespace std;
const int N = 1e5 + 10;
int n;//数组长度
int a[N];//存储数据
int res[N];//存储结果
//单调栈模板,找到长度为n的a数组中下一个大于X的元素Y
void nextgreaterNum(int a[],int n)
{
stack<int> st;
for (int i = n - 1;i >= 0;i--)//从后往前遍历
{
while (!st.empty() && st.top() <= a[i]) st.

本文介绍了单调栈的概念及其两种类型——单调递增栈和单调递减栈,并展示了它们在数组处理中的应用场景,如寻找右侧第一个大于当前元素的元素、左侧第一个小于当前元素的元素等。通过代码实现,详细解释了如何利用单调栈解决此类问题,并提供了进阶题目,讨论了如何找到元素左右两侧需要移动的步数。
最低0.47元/天 解锁文章
331

被折叠的 条评论
为什么被折叠?



