单调栈 ---[ 数据结构 ]

单调栈是一种特殊的数据结构,保证栈内元素单调递增或递减。它主要用于求解从左/右遍历中第一个比当前元素小/大的元素位置。单调栈分为单调递增和递减两种,分别用于找到当前位置附近最小或最大的元素。在解决直方图的最大矩形面积问题中,可以利用单调栈快速找到左右边界,从而计算最大面积。
摘要由CSDN通过智能技术生成

单调栈

定义
  1. 单调栈就是 栈内元素单调递增 或者 单调递减的 栈
  2. 并且只能在栈顶操作 (入栈和出栈)
  3. 单调栈的维护是O(n)的时间复杂度,所有元素只会 进栈一次

解题基本思想

用途:用于求 从左/右 遍历 得到第一个 比 它 小/大的元素的位置

元素  在出栈时 考虑 右侧边界(即右侧边界不符条件时 ,元素出栈)
         在入栈时 考虑 左侧边界 (栈内为单调序列,左侧边界相对固定)


实现方式

1.单调递增栈 : 从栈底到 栈顶 元素 序列单调 递增 (栈顶为 最大值)
  作用:获取离当前位置最近的一个小于当前值的元素的 位置。
(也可确定某个元素 在 一定长度 的 区间中 做最小值 )
2.单调递减栈 : 从栈底到 栈顶 元素 序列单调 递减 (栈顶为 最小值)
  作用:获取离当前位置最近的一个大于当前值的元素的 位置。
(也可确定某个元素 在 一定长度 的 区间中 做最大值 )

/*
* 单调 递增栈
*/
  stack<int > s;
    for(int i=0;i<n;i++)
    {
   
        while(!s.empty()&&a[s.top()]>a[i])   // 维护 递增栈
        {
   
            // 对s.top() 的相关元素 进行操作
            s.pop();
        }
        s.push(i);
    }
   
/*
* 单调 递减栈
*/
 stack<int > s;
    for(int i=0;i<n;i++
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值