解题思路
对于将要入栈的元素来说,在对栈进行更新后(即弹出了所有比自己大的元素),此时栈顶元素就是数组中左侧第一个比自己小的元素;
对于将要入栈的元素来说,在对栈进行更新后(即弹出了所有比自己小的元素),此时栈顶元素就是数组中左侧第一个比自己大的元素;
什么时候使用单调栈
给定一个序列,求序列中的每一个数左边或右边第一个比他大或比他小的数在什么地方;
补充
相关代码
import java.util.Scanner;
import java.util.Stack;public class Main {public static void main(String[] args){Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();Stack<Integer> stack = new Stack<>();int a[] = new int[n];for(int i=0;i<n;i++) a[i] = scanner.nextInt();for(int i=0;i<n;i++){int temp = a[i];//首先要判断temp是否符合入栈的条件,如果条件不满足,则删除栈中的元素使其最终符合。while(stack.isEmpty()!=true&&temp<=stack.peek()) stack.pop();//如果栈中存在元素,说明找到了左边第一个小于temp的元素if(stack.isEmpty()==false) System.out.print(stack.peek()+" ");else System.out.print(-1+" ");//找到元素后,让temp入栈,从而进行下一步stack.push(temp);}}
}