[AcWing]830. 单调栈 原创

算法标签:单调栈

题目简叙

在这里插入图片描述

思路

单调栈的概念是栈内所有数据都是单调递增或者递减
这里我们只需要构造一个单调递增的栈,然后反复查看栈顶,
此时的栈顶元素必然为栈内最大元素,如果栈顶比目标值大,就弹出该元素,直至栈顶元素比目标值小
这样我们栈内的元素必然是单调递增的

这样我们就可以获得左边第一个比它小的数

代码

#include<iostream>

using namespace std;
const int N = 1e5+10;
int stk[N],tt;

int main(){
    int n;
    cin>>n;
    
    int tmpn=0;
    while(n--){
        cin>>tmpn;
        while(stk[tt]>=tmpn&&tt){
            tt--;
        }  
        cout<<(tt?stk[tt]:-1)<<" ";
        stk[++tt]=tmpn;
    }
    return 0;
}

在这里插入图片描述

#include<iostream>
#include<stack>

using namespace std;

stack<int> stk;

int main(){
    int n;
    cin>>n;
    
    int tmpn=0;
    while(n--){
        cin>>tmpn;
        while (!stk.empty() && stk.top()>=tmpn){
            stk.pop();
        }
        cout<<(!stk.empty()?stk.top():-1)<<" ";
        stk.push(tmpn);
    }
    return 0;
}

在这里插入图片描述

posted @ 2024-06-15 10:00  俺叫西西弗斯  阅读(0)  评论(0)    收藏  举报  来源