503. Next Greater Element II

33 阅读1分钟

image.png

  • 把这个循环数组「拉直」,即复制该序列的前 n−1 个元素拼接在原序列的后面。这样我们就可以将这个新序列当作普通序列,用上文的方法来处理。
  • 不需要显性地将该循环数组「拉直」,而只需要在处理时对下标取模即可。
  • stack里存index,便利数组
    • 遇到比栈顶小的数,把这个数的index压栈
    • 遇到比栈顶大的数,不停地pop栈,计算对应index的nge
class Solution {
    public int[] nextGreaterElements(int[] nums) {
        int len = nums.length;
        int[] res = new int[len];
        Arrays.fill(res, -1);
        // stack里存index
        Stack<Integer> stack = new Stack<>();
        for (int i = 0; i < 2 * len - 1; i++) {
            int cur = i % len; // 取模
            if (stack.isEmpty() || nums[cur] <= nums[stack.peek()]) {
                stack.push(cur); // 数组中的元素比栈顶小
            } else {
                while (!stack.isEmpty() && nums[cur] > nums[stack.peek()]) {
                    res[stack.pop()] = nums[cur];
                }
                stack.push(cur);
            }
        }

        return res;
    }
}