Question 3 Next Greater Element III
找右边第二个比你大的
Analysis
我们已经知道,常规的use case: next greater element 可以用单调栈实现O(n)的解法
原来只有一类的元素:栈内等待右边第一个比我大的元素==> 普通单调栈
现在又多了一类元素:它已经被第一个比他的的人置换出来,但是第二个人还没有来==> 又是一个单调栈
Details
stack 1(还在等待第一次被置换的人)
stack 2(还在等待第二次被置换的人)
temp stack(为了保持stack 2里面的和stack 1里面的顺序,所以需要用一个来倒腾)
当有元素被stack 1里面替换出来放进stack2的时候,需要用temp stack倒腾一下
example
[10, 2,3,4, 0, 9,6]
stack 1: 10,4
stack 2: 3
result: 2: 4
// Some code
public int secondGreaterElement(int[] array) {
int[] result = new int[array.length];
Arrays.fill(result, -1);
Dequeue<Integer> stack1 = new ArrayDeque<>();
Dequeue<Integer> stack2 = new ArrayDeque<>();
Dequeue<Integer> temp = new ArrayDeque<>();
for (int i = 0; i < array.length; i++) {
while (!stack2.isEmpty() && array[stack2.peekLast()] < array[i]) {
result[stack2.pollLast()] = array[i];
}
while (!stack1.isEmpty() && array[stack.peekLast()] < array[i]) {
stack2.offerLast(temp.pollLast());
}
stack1.offerLast(array[i]);
}
return result;
}
Last updated