题目描述
给定一个长度为 N 的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出 −1。
输入格式
第一行包含整数 N,表示数列长度。
第二行包含 N 个整数,表示整数数列。
输出格式
共一行,包含 N 个整数,其中第 i 个数表示第 i 个数的左边第一个比它小的数,如果不存在则输出 −1。
数据范围
$1≤N≤10^5$
$1≤数列中元素≤10^9$
输入样例:
5
3 4 2 7 5
输出样例:
-1 3 -1 2 2
思路
单调栈:单调递增或单调减的栈
这道题就是一道经典的运用这种性质的题
我们来证明一下:
设:x<y a[x]>a[y]
当a[x]<a[i]时
a[y]是不是相对于a[i]更近一些?
且a[i]>a[x],a[x]>a[y],那么a[i]>a[y]对不对?
这样就得到了a[y]相对于a[x]是更优的答案
所以就可以把a[x]删掉(因为a[y]更优,所以用不到a[x])
由此可以构成单调栈
代码
#include<iostream>
using namespace std;
const int N = 10010;
int stk[N],tt;
int main()
{
int n;
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;
}