单调栈即指从栈顶到栈底的元素是单增或者单减的,本题是想要查找到每个位置左右两边最近的小于它的位置,所以使用单调递减的栈。
方法是遍历整个数组的索引,若栈为空,则将该索引放入栈里,若栈不为空,则比较栈顶索引对应的值与当前遍历到的索引对应的值。
1、若栈顶索引对应的值较小,则继续将当前遍历到的索引放入栈中,保持单调减的特性
2、若栈顶索引对应的值较大,则将该索引从栈顶弹出。注意理解,此时可以找到弹出的索引对应的左右两边最近的小于它的位置,左边最近的位置--新的栈顶的索引(若栈为空,则为-1),右边最近的位置--当前遍历到的索引(若已遍历完,则为-1)
n = int(input()) arr = input().split() arr = list(map(int,arr)) stack = [] index_list = [[] for i in range(n)] for i in range(len(arr)): if not stack: stack.append(i) else: while stack and arr[stack[-1]] > arr[i]: current_index = stack.pop() if stack: index_list[current_index] = [stack[-1],i] else: index_list[current_index] = [-1,i] stack.append(i) while stack: current_index = stack.pop() if stack: index_list[current_index] = [stack[-1],-1] else: index_list[current_index] = [-1,-1] for i in index_list: print(i[0],i[1])