美文网首页
单调栈 02

单调栈 02

作者: 眼若繁星丶 | 来源:发表于2021-03-06 10:30 被阅读0次

单调栈 02

LeetCode 503

单调栈

单调栈里存的是数组nums的下标,且栈是单调递增的。所以在遍历数组的过程中,要循环查看栈顶元素对应值是否小于当前值,若小于,则当前元素就是栈顶下标对应位置的“更大的数”,需要弹栈,然后给res赋值记录下来。最后让当前位置下标入栈即可。

这里有个细节,因为要找到整个数组的“更大的数”,即下一个数,所以需要遍历两遍数组。为了代码的统一性,所以循环 2 * n - 1次,下标 采取 i % n 的方式达到循环不越界的效果。

代码如下:

class Solution {
    public int[] nextGreaterElements(int[] nums) {
        int n = nums.length;
        int[] res = new int[n];
        Arrays.fill(res, -1);
        Deque<Integer> stack = new LinkedList<Integer>();
        for (int i = 0; i < 2 * n - 1; i++) {
            while (!stack.isEmpty() && nums[stack.peek()] < nums[i % n]) {
                res[stack.pop()] = nums[i % n];
            }
            stack.push(i % n);
        }
        return res;
    }
}

测试代码,便于理解栈的变化

public class Solution {

    public int[] nextGreaterElements(int[] nums) {
        int n = nums.length;
        int[] res = new int[n];
        Arrays.fill(res, -1);
        Deque<Integer> stack = new LinkedList<Integer>();
        for (int i = 0; i < 2 * n - 1; i++) {
            System.out.println("i = " + i);
            while (!stack.isEmpty() && nums[stack.peek()] < nums[i % n]) {
                res[stack.pop()] = nums[i % n];
            }
            System.out.print("res[]: ");
            System.out.println(Arrays.toString(res));
            stack.push(i % n);
            System.out.print("stack: ");
            System.out.println(stack);
        }
        return res;
    }

    public static void main(String[] args) {
        Solution s = new Solution();
        System.out.println(Arrays.toString(s.nextGreaterElements(new int[]{1, 8, -1, -100, -2, -222, 1111111, -111111})));
    }

}

i = 0
res[]: [-1, -1, -1, -1, -1, -1, -1, -1]
stack: [0]
i = 1
res[]: [8, -1, -1, -1, -1, -1, -1, -1]
stack: [1]
i = 2
res[]: [8, -1, -1, -1, -1, -1, -1, -1]
stack: [2, 1]
i = 3
res[]: [8, -1, -1, -1, -1, -1, -1, -1]
stack: [3, 2, 1]
i = 4
res[]: [8, -1, -1, -2, -1, -1, -1, -1]
stack: [4, 2, 1]
i = 5
res[]: [8, -1, -1, -2, -1, -1, -1, -1]
stack: [5, 4, 2, 1]
i = 6
res[]: [8, 1111111, 1111111, -2, 1111111, 1111111, -1, -1]
stack: [6]
i = 7
res[]: [8, 1111111, 1111111, -2, 1111111, 1111111, -1, -1]
stack: [7, 6]
i = 8
res[]: [8, 1111111, 1111111, -2, 1111111, 1111111, -1, 1]
stack: [0, 6]
i = 9
res[]: [8, 1111111, 1111111, -2, 1111111, 1111111, -1, 1]
stack: [1, 6]
i = 10
res[]: [8, 1111111, 1111111, -2, 1111111, 1111111, -1, 1]
stack: [2, 1, 6]
i = 11
res[]: [8, 1111111, 1111111, -2, 1111111, 1111111, -1, 1]
stack: [3, 2, 1, 6]
i = 12
res[]: [8, 1111111, 1111111, -2, 1111111, 1111111, -1, 1]
stack: [4, 2, 1, 6]
i = 13
res[]: [8, 1111111, 1111111, -2, 1111111, 1111111, -1, 1]
stack: [5, 4, 2, 1, 6]
i = 14
res[]: [8, 1111111, 1111111, -2, 1111111, 1111111, -1, 1]
stack: [6, 6]
[8, 1111111, 1111111, -2, 1111111, 1111111, -1, 1]

Process finished with exit code 0

相关文章

  • 单调栈 02

    单调栈 02 [https://imgtu.com/i/6nQUQU] [https://leetcode-cn....

  • 单调栈和应用实践

    什么是单调栈 单调栈的定义:单调栈即满足单调性的栈结构。与单调队列相比,其只在一端进行进出。 如何使用单调栈 单调...

  • 1.单调栈

    一、单调栈定义 单调栈(monotone-stack)是指栈内元素(栈底到栈顶)都是(严格)单调递增或者单调递减的...

  • 单调栈 2020-06-12(未经允许,禁止转载)

    1.单调栈 指栈内元素保持单调性的栈结构,分为单调增栈(栈底到栈顶元素递增)和单调减栈(栈底到栈顶元素递减) 2....

  • LeetCode刷题指北----单调栈

    1.什么是单调栈?有什么好处? 定义: 单调栈就是栈内元素递增或者单调递减的栈,并且只能在栈顶操作。单调栈的维护是...

  • C语言之单调栈

    单调栈 What 单调栈也是栈的一种,满足先进后出的原则,另外,单调栈中的元素是有序的,分为两种 单调递增栈:单调...

  • 腾讯笔试--逛街

    主要的知识点是:单调栈,该题牢牢记得:栈中记录当前楼能看到的元素 单调栈是单调递增栈,栈顶是最小值单调栈存的是能看...

  • 题解——单调栈

    单调栈题解 单调栈结构 牛客链接 方法:单调栈 算法 这里维护一个单调递增栈,可以找到比当前元素要小的元约定:当前...

  • 单调栈

    leetcode - 42. 接雨水单调栈即元素严格单调递增或单调递减的栈,只需要在元素入栈的时候保持栈的单调性即...

  • Java版算法模版总结(2)

    本次233酱介绍下单调栈、单调队列、并查集、KMP算法,欢迎交流指正~ 单调栈 「单调栈」首先是一种基于栈的数据结...

网友评论

      本文标题:单调栈 02

      本文链接:https://www.haomeiwen.com/subject/ncmjqltx.html