单调栈

    科技2024-08-06  27

    参考https://leetcode-cn.com/problems/largest-rectangle-in-histogram/solution/84-by-ikaruga/

    1. 什么是单调栈

    单调栈分为单调递增栈和单调递减栈

    单调递增栈即栈内元素保持单调递增的栈同理单调递减栈即栈内元素保持单调递减的栈

    操作规则(下面都以单调递增栈为例)

    如果新的元素比栈顶元素大,就入栈如果新的元素较小,那就一直把栈内元素弹出来,直到栈顶比新元素小

    加入这样一个规则之后,会有什么效果

    栈内的元素是递增的当元素出栈时,说明这个新元素是出栈元素向后找第一个比其小的元素

    举个例子,配合下图,现在索引在 6 ,栈里是 1 5 6 。

    接下来新元素是 2 ,那么 6 需要出栈。 当 6 出栈时,右边 2 代表是 6 右边第一个比 6 小的元素。 当元素出栈后,说明新栈顶元素是出栈元素向前找第一个比其小的元素 当 6 出栈时,5 成为新的栈顶,那么 5 就是 6 左边第一个比 6 小的元素。

    Java代码

    public void o_tack(int[] arr){ Stack<Integer> stack = new Stack<>(); for (int i = 0; i < arr.length; i++) { while (!stack.isEmpty() && stack.peek()>arr[i]){ stack.pop(); } stack.push(arr[i]); } }

    力扣上两个典型应用: https://leetcode-cn.com/problems/largest-rectangle-in-histogram/ https://leetcode-cn.com/problems/trapping-rain-water/

    Processed: 0.009, SQL: 8