单调栈

单调栈

单调栈用来解决求数组中每个元素的一侧 第一个比元素本身大或小的数,如果使用常规方式进行两次遍历,时间复杂度是O(n2)

但是使用单调栈来存储,时间复杂度可以优化到 O(n)

 

思路:以输出每个元素左侧的第一个比他小的数为例;

     使用一个栈来存放输入进去的元素,
     1.如果输入的数是第一个数,那么左侧没有比他更小的数,只需要将数入栈
     2.如果输入一个数,他左侧的元素比他小,那么左侧的就是第一个比他小的数(因为每次都需要将最新输入的数入栈)
     3.如果输入一个数,左侧的元素比他大,因为本元素会入栈,那么这个大的元素在之后不可能是其他元素的第一个小的数,以后都不可能被用到,直接在栈中删除

 

题目

 输入样例:

5
3 4 2 7 5

期望输出:

-1 3 -1 2 2 

代码实现:

#include<bits/stdc++.h>
using namespace std;

const int N = 1e6+9;
int n,h;
int s[N];

/***

在用数组模拟栈的过程中,开始时h指向0,每次添加元素的时候使用s[++h] = x
这样可以使得 h所在的下标就是栈顶,存储的栈从 1到h

*///

int main()
{
    cin>>n;
    for(int i=0;i<n;i++)
    {
        int x;
        cin>>x;
        //如果栈不为空,并且栈顶元素大于此输入元素
        while(h!=0 && s[h]>=x) h--;
        //如果遍历到头,则没有比他小的数
        if(h==0) cout<<-1<<' ';
        //如果没遍历到头,输出比他小的数
        else cout<<s[h]<<' ';

        //将刚输入的数加入到栈中
        s[++h] = x;
    }
}

  

posted @ 2025-05-16 00:28  小花护符  阅读(14)  评论(0)    收藏  举报