题目概述:找到每个 i 位置左边和右边离 i 最近且值比 arr[i] 小的位置
相关链接:牛客网-单调栈进阶
关键标签:数组、单调栈
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] nums = new int[n];
int[][] result = new int[n][2];
for (int i = 0; i < n; i++) {
nums[i] = in.nextInt();
}
// 遍历阶段
ArrayDeque<Integer> stack = new ArrayDeque<>();
for (int i = 0; i < n; i++) {
while (!stack.isEmpty() && nums[stack.peekFirst()] > nums[i]) {
int index = stack.pollFirst();
result[index][0] = stack.isEmpty() ? -1 : stack.peekFirst();
result[index][1] = i;
}
stack.offerFirst(i);
}
// 清空阶段
while (!stack.isEmpty()) {
int index = stack.pollFirst();
result[index][0] = stack.isEmpty() ? -1 : stack.peekFirst();
result[index][1] = -1;
}
// 修正阶段
for (int i = 0; i < n; i++) {
if (result[i][0] != -1 && nums[i] == nums[result[i][0]]) {
result[i][0] = result[result[i][0]][0];
}
}
StringBuffer sb = new StringBuffer();
for (int i = 0; i < n; i++) {
sb.append(result[i][0]).append(" ").append(result[i][1]);
if (i < n - 1) {
sb.append("\n");
}
}
System.out.println(sb.toString());
}
}