算法基础17 —— 单调栈(Acwing 830 单调栈)

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

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

在这里插入图片描述

单调递减栈:栈中的元素从栈底到栈顶是单调递减的。不难发现,单调递减栈的出栈序列递增
在这里插入图片描述

单调栈的应用
  • 求数列中每个元素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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值