作用:求一段序列中每一个数左边(右边)离他最近的且比他小(大)的数
用栈暴力枚举->去掉无用元素->看是否有单调性
每次输入x,若存在stk[top]>=x,则pop() (下次输入y时由于x<=stk[top],故如果满足x<=stk[top]<y,则x就是解,stk[top]实际上没有作用,故可以删去,连续弹出后,形成一个严格单调的栈序列),最后push_back(x)。
给定一个长度为 N 的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出 −1。
#include<algorithm>
#include<iostream>
using namespace std;
const int N = 100010;
int stk[N], top = -1;
int main()
{
int n;
cin >> n;
while (n--)
{
int k;
cin >> k;
while(top!=-1&&k <= stk[top]) top--;
if (top==-1 ) cout << -1<<" ";
else cout << stk[top] << " ";
stk[++top] = k;
}
return 0;
}