题目描述
给定一个长度为N的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出-1。
输入格式 第一行包含整数N,表示数列长度。
第二行包含N个整数,表示整数数列。
输出格式 共一行,包含N个整数,其中第i个数表示第i个数的左边第一个比它小的数,如果不存在则输出-1。
数据范围 1≤N≤105 1≤数列中元素≤109 输入样例: 5 3 4 2 7 5 输出样例: -1 3 -1 2 2
思路
单调栈的思想是利用不断迭代的方式,将当前的元素x与栈顶元素进行比较,按照单调性性质来决定是对栈顶元素做出栈操作还是将当前元素压栈来保证栈的单调性
有一个隐藏的性质,如果是单调递增,如果左边有比当前x还大的数,可以通过单调栈找出离当前x位置最近的较小点位置(也可以说是第一个小的位置值)
一行包含N个整数,其中第i个数表示第i个数的左边第一个比它小的数,如果不存在则输出-1。
因为是找左边第一个小的数,其符合栈的特性,先对后插入的节点进行查找,即后进先出。这完全符合单调栈的性质
举例
初始化栈的tt = 0, 存储位置从1开始, 当tt = 0的时候栈为空,主要方便写if(tt) print(empty) stack = [], 因为找比当前值x小的元素,所以要保证stack单调递增。
修改二个点:1. > => < 2. 3 => 2
3 4 2 7 5
3:
栈中为空, 输出-1, stack[tt+1] = stack[1] = 3 stack = [3] 4: 3 < 4 输出3 , stack[tt+1] = stack[2] = 4 stack = [3, 4]
2:
2 < 4 4出栈 , tt - 1 = 1 stack = [3] (实际stack = [3, 4])
2 < 3 3出栈 , tt - 1 = 0(栈空) stack = [] (实际stack = [3, 4])
栈中为空 输出-1, stack[tt+1] = stack[1] = 2 stack = [2] (实际stack = [2, 4])
7: 7 > 2 输出2 , stack[tt+1] = stack[2] = 7 stack = [2, 7] 5:
7 > 5 7出栈 , tt - 1 = 1 stack = [2] (实际stack = [2, 7]) 5 > 2 输出2 , tt + 1 = 2 stack = [2, 5] 我们在操作的过程,栈中元素一直保持单调性