用单调递增栈,当该元素可以入栈的时候,栈顶元素就是它左侧第一个比它小的元素。
以:3 4 2 7 5 为例,过程如下:
#include<iostream>
#include<cstdio>
using namespace std;
const int N = 100010;
int h[N];
int main()
{
int a[N];
int n;
cin >> n;
int tt = 0;
// 单调栈中维护的是一个单调递增的序列。
// 一旦入栈时,有元素大于等于它,那就把这些都删掉
// 直至满足栈底到栈顶的元素单调递增。
while(n -- )
{
int m;
scanf("%d", &m);
// 因为是找第一个小的值,不是第一个不大于的值
// 大于等于的都要删除
while(tt && h[tt] >= m) tt--;
// 如果删完了空了,输出-1
if(!tt) printf("-1 ");
// 不空则,输出栈顶元素
else printf("%d ", h[tt]);//栈顶元素就是左侧第一个比它小的元素。
// 自己入栈
h[++tt] = m;
}
return 0;
}```