单调栈

过程

单调栈具有贼有趣的实现方式:
在查找的同时,删除多余的,插入新的

那么删除插入的过程和依据呢?

我是nums[i],以找出左边第一个比我小的元素为例:

栈里的元素是非降序的,而且都在我左边

凡是栈里比我大的数(记为big),对找出左边第一个比我小的数来说,无效,可删

对我右边的数来说,big也是对他们无效的(对他们来说我更近,还比big更小),也可删

执行删除

找到比我小的数记为small,可以把small这样那样做若干处理

我的左边第一个比我小的元素找好了,我加入栈顶

轮到nums里下一个开始找,从栈顶开始,凡是比他大的数,可删...

Iareges的这篇博客讲得很好

以下是acwing 830. 单调栈

模板1-数组存储后再遍历

cpp 复制代码
#include <iostream>
using namespace std;

const int N = 100050;
int a[N],q[N];

int main(){
    int n,tt=0;
    cin>>n;
    for(int i=0;i<n;i++ ){
        cin>>a[i];
}
    for(int i=0;i<n;i++ ){
        while(tt>0 && q[tt]>=a[i]) tt--;
        if(tt==0) cout<<"-1"<<" ";
        else cout<<q[tt]<<" ";
        q[++tt]=a[i];
    }
        return 0;

模板2-单变量读入不存储

cpp 复制代码
#include <iostream>
using namespace std;

const int N = 100010;
int stk[N], tt;

int main()
{
    int n;
    cin >> n;
    while (n -- ){
        int x;
        scanf("%d", &x);
        while (tt && stk[tt] >= x) tt -- ;
        if (!tt) printf("-1 ");
        else printf("%d ", stk[tt]);
        stk[ ++ tt] = x;
    }
    return 0;
}
相关推荐
颜酱20 分钟前
理解二叉树最近公共祖先(LCA):从基础到变种解析
javascript·后端·算法
地平线开发者16 小时前
SparseDrive 模型导出与性能优化实战
算法·自动驾驶
董董灿是个攻城狮17 小时前
大模型连载2:初步认识 tokenizer 的过程
算法
地平线开发者17 小时前
地平线 VP 接口工程实践(一):hbVPRoiResize 接口功能、使用约束与典型问题总结
算法·自动驾驶
罗西的思考17 小时前
AI Agent框架探秘:拆解 OpenHands(10)--- Runtime
人工智能·算法·机器学习
HXhlx20 小时前
CART决策树基本原理
算法·机器学习
Wect21 小时前
LeetCode 210. 课程表 II 题解:Kahn算法+DFS 双解法精讲
前端·算法·typescript
颜酱1 天前
单调队列:滑动窗口极值问题的最优解(通用模板版)
javascript·后端·算法
Gorway1 天前
解析残差网络 (ResNet)
算法
拖拉斯旋风1 天前
LeetCode 经典算法题解析:优先队列与广度优先搜索的巧妙应用
算法