单调栈应用————找到数组中每个位置上最近的较小数


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]);
        }
    }
}