算法1
思路:单调栈问题通俗来讲就是寻找当前数左边第一个比他小的数
我们如果用暴力来做就是,这里展示部分代码,体会一下就可以
for(int i=0;i<n;i++)
{
for(int j=i-1;j>=0;j--)//j是i的前一个数
{
if(a[i]>a[j])
cout<<a[i]<<' ';
break;
}
}
优化:我们从另外一个方面去想,如果是 一个单调递减的,那么永远就不会存在满足要求的数,所以对于不满足要求的数,,我们将其弹出栈,维持栈里面 元素始终是一个单调递增的,那么与之相邻的左边的第一个数,就是满足要求的数
C++ 代码
#include<iostream>
using namespace std;
const int N=100010;
int n;
int stk[N],tt;
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
int x;
cin>>x;//当栈顶不为空,并且栈顶元素大于当前数,说明此时是一个单调递减的,不满足条件,所以弹出栈,维持是一个单调递增的数列
while(tt &&stk[tt]>=x) tt--;
if(tt)cout<<stk[tt]<<' ';//如果栈顶元素存在,那么此时左边并且距离她最近的元素就是所要求的数
else cout<<-1<<' ';//如果不满足,说明是单调增序列,左边不存在比他小的数,输出-1
stk[++tt]=x;//然后将下一个数压入栈,继续比较
}
return 0;
}