单调栈——找到最邻的较小数
单调栈应用————找到数组中每个位置上最近的较小数
https://www.nowcoder.com/profile/73367985/codeBookDetail?submissionId=54957816
题目描述
给定一个不含有重复值的数组 arr,找到每一个 i 位置左边和右边离 i 位置最近且值比 arr[i] 小的位置。返回所有位置相应的信息。
输入描述:
第一行输入一个数字 n,表示数组 arr 的长度。
以下一行输出 n个数字,表示数组的值。
输出描述:
输出n行,每行两个数字 L 和 R,如果不存在,则值为-1,下标从0开始。
示例1
输入
7
3 4 1 5 6 2 7
输出
-1 2
0 2
-1 -1
2 5
3 5
2 -1
5 -1
import java.util.LinkedList; import java.util.Scanner; public class Main { public static void main(String[] args){ Scanner in = new Scanner(System.in); int N = in.nextInt(); int [] arr = new int[N]; for(int i=0;i<N;i++){ arr[i]=in.nextInt(); } int [][] res = new int[N][2]; LinkedList<Integer> stack = new LinkedList<Integer>(); //单调栈部分,栈中存放数的下标 for(int i =0;i<N;i++) { while(!stack.isEmpty()&&arr[stack.peek()]>=arr[i]) { res[stack.pop()][1]=i; } if(stack.isEmpty()) { res[i][0]=-1; }else { res[i][0]=stack.peek(); } stack.push(i); } //对还在栈中的元素弹出,并对结果数组赋值 while(!stack.isEmpty()) { res[stack.pop()][1]=-1; } for(int i =0;i<N;i++) { System.out.println(res[i][0]+" "+res[i][1]); } } }