【Leetcode】503. Next Greater Element II

题目地址:

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;
    }
}

时空复杂度 O ( n ) O(n)

算法正确性证明:
由算法的代码知,任何时候stack都是单调下降的。对于任何一个数 a a a a 对应的next greater element,首先 a a 一定会push进栈,其次,在 a a 的next greater element进栈之前, a a 绝对不会弹出。所以在 a a 的next greater element来的时候, a a 所对应的结果一定会被记在 r e s res 里。证明完毕。

发布了86 篇原创文章 · 获赞 0 · 访问量 1216

猜你喜欢

转载自blog.csdn.net/qq_46105170/article/details/103998588