题目地址:
https://leetcode.com/problems/next-greater-element-ii/
给定一个数组,将它想象成一个循环数组,求每个数右边的最靠近它且比它大的数。经典的单调栈的应用。维护一个单调下降的栈,每当新push的数大于栈顶,就得知栈顶右边最靠近它且比它大的数就是那个要新push的数,更新最终结果res,并push进新数。由于是循环数组,我们要遍历到2 * nums.length-1
。
import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.Deque;
public class Solution {
public int[] nextGreaterElements(int[] nums) {
if (nums == null || nums.length == 0) {
return nums;
}
Deque<Integer> stack = new LinkedList<>();
int len = nums.length;
int[] res = new int[len];
Arrays.fill(res, -1);
for (int i = 0; i < 2 * len - 1; i++) {
while (!stack.isEmpty() && nums[stack.peek()] < nums[i % len]) {
res[stack.pop()] = nums[i % len];
}
stack.push(i % len);
}
return res;
}
}
时空复杂度 。
算法正确性证明:
由算法的代码知,任何时候stack都是单调下降的。对于任何一个数
和
对应的next greater element,首先
一定会push进栈,其次,在
的next greater element进栈之前,
绝对不会弹出。所以在
的next greater element来的时候,
所对应的结果一定会被记在
里。证明完毕。