[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;
}

 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号