单调栈

过程

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

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

我是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;
}
相关推荐
小码农<^_^>33 分钟前
优选算法精品课--滑动窗口算法(一)
算法
羊小猪~~35 分钟前
神经网络基础--什么是正向传播??什么是方向传播??
人工智能·pytorch·python·深度学习·神经网络·算法·机器学习
软工菜鸡1 小时前
预训练语言模型BERT——PaddleNLP中的预训练模型
大数据·人工智能·深度学习·算法·语言模型·自然语言处理·bert
南宫生1 小时前
贪心算法习题其三【力扣】【算法学习day.20】
java·数据结构·学习·算法·leetcode·贪心算法
AI视觉网奇1 小时前
sklearn 安装使用笔记
人工智能·算法·sklearn
JingHongB2 小时前
代码随想录算法训练营Day55 | 图论理论基础、深度优先搜索理论基础、卡玛网 98.所有可达路径、797. 所有可能的路径、广度优先搜索理论基础
算法·深度优先·图论
weixin_432702262 小时前
代码随想录算法训练营第五十五天|图论理论基础
数据结构·python·算法·深度优先·图论
小冉在学习2 小时前
day52 图论章节刷题Part04(110.字符串接龙、105.有向图的完全可达性、106.岛屿的周长 )
算法·深度优先·图论
Repeat7152 小时前
图论基础--孤岛系列
算法·深度优先·广度优先·图论基础
小冉在学习2 小时前
day53 图论章节刷题Part05(并查集理论基础、寻找存在的路径)
java·算法·图论