单调栈-找序列中比当前数左边,且比当前数小的第一个数
为什么是单调递增栈
ans:如果当前这个数,比之前的某些数要小,那么之前数一定不会是答案,因为找的是第一个小的数。而如果当前的数比之前的数都大,那么如果当前这个数成为不了答案,则前面的数还有可能成为答案。
因此用栈来保存,比当前这个数所有小的数,这个栈一定是单调递增的。
tips:其他类型的单调栈也可以用同样的方法分析。
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
const int N = 100010;
int stk[N], tt; //tt = 0表示栈为空
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
int x;
scanf("%d", &x);
while (tt && stk[tt] >= x) tt--; // 栈不为空,且栈顶元素>= x,不断出栈
if (tt) cout << stk[tt] << ' '; // 当前栈不为空,则栈顶元素就是要求的值
else cout << -1 << ' '; //为空,则没有元素比他小
stk[++tt] = x; //tt 从1开始
}
return 0;
}