题目描述
给定一个长度为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
算法1
单调栈
最常见应用场景:给定一个序列,求一下序列中的每一个数左(右)边离他最近的且比他小(大)的点在哪。
单调栈中的值是单调的
python 代码
if __name__ == "__main__":
n = int(input())
a = list(map(int,input().split()))
stk = [0]*100010
tt=0
for i in range(n):
while tt and stk[tt]>=a[i]: #这里保证栈里元素都是小于a[i]的,执行完后,栈顶元素就是最左边比a[i]小的点
tt-=1
if tt:
print(stk[tt],end=" ")
else:
print("-1",end=" ")
tt+=1
stk[tt]=a[i]