LeetCode 503. 下一个更大元素 II

Posted 数据结构和算法

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 503. 下一个更大元素 II相关的知识,希望对你有一定的参考价值。

截止到目前我已经写了 500多道算法题,其中部分已经整理成了pdf文档,目前总共有1000多页(并且还会不断的增加),大家可以免费下载
下载链接https://pan.baidu.com/s/1hjwK0ZeRxYGB8lIkbKuQgQ
提取码:6666

在这里插入图片描述


单调栈解决

这题可以参照前面讲的
379,柱状图中最大的矩形(难)
382,每日温度的5种解题思路
386,链表中的下一个更大节点
519,单调栈解下一个更大元素 I

在这里插入图片描述

    int res[] = new int[length];
    Stack<Integer> stack = new Stack<>();
    for (int i = 0; i < length; i++) {
        while (!stack.isEmpty() && nums[stack.peek()] < nums[i])
            res[stack.pop()] = nums[i];
        //当前元素的下标入栈
        stack.push(i); 
    }

对于这道题完全可以套用上面的模板,因为题中说了是循环数组,我们只需要把数组遍历两遍即可,代码如下

public int[] nextGreaterElements(int[] nums) {
    int length = nums.length;
    int res[] = new int[length];
    Arrays.fill(res, -1);//默认都为-1
    Stack<Integer> stack = new Stack<>();
    //相当于把数组循环两遍
    for (int i = 0; i < length * 2; i++) {
        //遍历数组的第index(index从0开始)个元素,因为数组会遍历
        //两遍,会导致数组越界异常,所以这里要对数组长度进行求余
        int index = i % length;
        //单调栈,他存储的是元素的下标,不是元素具体值,从栈顶
        //到栈底所对应的值是递增的(栈顶元素在数组中对应的值最小,
        //栈底元素对应的值最大),如果栈顶元素对应的值比nums[index]小,
        //说明栈顶元素对应的值遇到了右边第一个比他大的值,然后栈顶元素出栈,
        //让他对应的位置变为nums[index],也就是他右边第一个比他大的值,
        //然后继续判断……
        while (!stack.isEmpty() && nums[stack.peek()] < nums[index])
            res[stack.pop()] = nums[index];
        //当前元素的下标入栈
        stack.push(index);
    }
    return res;
}

以上是关于LeetCode 503. 下一个更大元素 II的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 0503. 下一个更大元素 II

503.下一个更大元素 II

503. 下一个更大元素 II

503. 下一个更大元素 II

503. Next Greater Element II 下一个更大元素

刷题6:下一个更大元素 II