给定一个不含有重复值的数组 arr,找到每一个 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[] arr=new int[n];
for(int i=0;i<n;i++){
arr[i]=in.nextInt();
}
int[] left=new int[n];
int[] right=new int[n];
Stack<Integer>stack=new Stack<>();
for(int i=0;i<n;i++){
if(stack.empty()){
stack.add(i);
}
else{
int topindex=stack.peek();
while((!stack.empty())&&arr[i]<arr[topindex]){
int popindex=stack.pop();
right[popindex]=i;
if(stack.empty()){
left[popindex]=-1;
}
else{
left[popindex]=stack.peek();
topindex=stack.peek();
}
}
stack.add(i);
}
}
while(!stack.empty()){
int popindex=stack.pop();
right[popindex]=-1;
if(stack.empty()){
left[popindex]=-1;
}
else{
left[popindex]=stack.peek();
}
}
for(int i=0;i<n;i++) {
System.out.println(left[i]+" "+right[i]);
}
}
}