单调栈
单调栈
单调栈用来解决求数组中每个元素的一侧 第一个比元素本身大或小的数,如果使用常规方式进行两次遍历,时间复杂度是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;
}
}

浙公网安备 33010602011771号