栈, 单调栈
单调栈例题
想找 "从当前元素向某一方向的第一个 (大于 / 小于) 自己的元素",就要靠单调栈来维护单调性,对应的是 (递减 / 递增)。
public class Main {
public static int[] getHeight(int[] heights){
int n = heights.length;
int[] arr = new int[n];
// Stack stores index of people
Stack<Integer> stack = new Stack<>();
for(int i = 0; i < n; i++){
while(!stack.isEmpty() && heights[stack.peek()] <= heights[i]){
arr[stack.pop()] = i;
}
stack.push(i);
}
while(!stack.isEmpty()){
arr[stack.pop()] = -1;
}
return arr;
}
public static void main(String[] args){
int[] heights1 = {3,2,5,6,1,2};
int[] heights2 = {1,2,3,4,5,6};
int[] heights3 = {6,5,4,3,2,1};
int[] heights4 = {6,1,3,4,2,5};
int[] arr = getHeight(heights4);
for(int i = 0; i < arr.length; i++){
System.out.print(arr[i] + " ");
}
}
}顺着上一题的思路,这题比较暴力的解法可以分为三步:
这个解法的思想也可以推广到任意 k ,k比较小或者为常数的情况,毕竟对于常数 k ,O(k) = O(1).
正解的流程:
难点在于,为什么这么做是正确的?
Last updated