核心思路
单调栈,唯一注意的就是栈内存放的是元素的下标,不是元素值,容易混。
算法设计流程
单调栈设计流程:
遍历数组元素,当栈为空,就存放当前数组元素的下标。
否则,当while栈不为空且当前元素栈顶指的下标对应的元素小于当前数组元素,就弹出栈顶元素,然后将栈顶元素作为结果数组下标,比栈顶元素指的元素大的元素的下标作为结果数组的值。然后将当前元素的下标加入栈内。
代码细节
import java.util.Arrays;
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();
scanner.nextLine();
int[] height=new int[N];
String[] temp=scanner.nextLine().split(" ");
for (int i = 0; i < N; i++) {
height[i]=Integer.parseInt(temp[i]);
}
Stack<Integer> stack=new Stack<>();
int[] res=new int[N];
for (int i = 0; i < N; i++) {
while (!stack.isEmpty()&&height[i]>=height[stack.peek()]){
res[stack.pop()]=i;
}
stack.push(i);
}
System.out.println(Arrays.toString(res));
}
}