题目描述
给定一个长度为 N 的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出 −1。
输入格式
第一行包含整数 N (1≤N≤10^5),表示数列长度。
第二行包含 N 个整数,表示整数数列。1≤ai≤10^9。
输出格式
共一行,包含 N 个整数,其中第 i 个数表示第 i 个数的左边第一个比它小的数,如果不存在则输出 −1。
输入样例
5
3 4 2 7 5
输出样例
-1 3 -1 2 2
注释版代码
//此题要求解出每个数左边第一个比它小的数
//我们把左边已经输入的数存放到一个栈中,因为栈的特性是后进先出
#include<iostream>
using namespace std;
const int N=100010;
int n;
int stk[N],tt;
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
int x;
scanf("%d",&x);
while(tt&&stk[tt]>=x)
{
tt--;//tt不为0,且stk[tt]>=x,也就是stk里面这个数大于目标值,他不应该在里面,弹出即可
}
if(tt) printf("%d ",stk[tt]);//如果上述条件都满足了,那说明stk里面的值就是第一个小于x的值,输出
else printf("-1 ");//如果都弹出去完了,tt为0了,也就说明stk里面为空,空的话就不用就一定没有,输出-1
stk[++tt]=x;//然后将x放进栈中
}
return 0;
}