首页 > 其他分享 >单调栈

单调栈

时间:2023-03-26 11:11:06浏览次数:41  
标签:deque val 元素 栈中 递减 单调

参考:https://www.bilibili.com/video/BV1Y441117gR/?from=search&seid=9796499757209042214&spm_id_from=333.337.0.0&vd_source=46d50b5d646b50dcb2a208d3946b1598

设计单调栈的目的是为了解决一些需要快速找到某个区间最大/最小值的问题

设计单调栈的主要目的是解决特定类型的问题,使得问题可以更高效、更简单地被解决。

单调栈具有单调性质,即栈中元素的值保持单调递增或单调递减。这种单调性质在解决问题时非常有用。例如,当需要快速找到一个数列中每个元素的下一个更大元素时,可以使用单调递减栈来解决,其时间复杂度为O(n)。如果不使用单调栈,该问题的时间复杂度将是O(n²),显然效率更低。

因此,设计单调栈可以使得某些问题可以变得更加高效,而且解决问题的方法也更加简单。但是需要注意的是,并不是所有问题都可以使用单调栈来解决,因此需要对问题进行仔细分析,才能决定是否需要使用单调栈。

调栈是一种特殊的栈,它具有单调性质,即栈中元素的值保持单调递增或单调递减。通常使用单调递增栈和单调递减栈两种类型,分别用于解决不同类型的问题。

在单调递增栈中,栈顶元素为当前栈中最大的元素,新的元素进栈时,将栈中所有比它小的元素依次弹出,直到栈顶元素大于等于该元素,然后将该元素入栈。这样保证栈中元素的单调递增。

而在单调递减栈中,栈顶元素为当前栈中最小的元素,新的元素进栈时,将栈中所有比它大的元素依次弹出,直到栈顶元素小于等于该元素,然后将该元素入栈。这样保证栈中元素的单调递减。

单调栈的应用非常广泛,例如可以用单调递减栈来解决"下一个更大元素"类问题,用单调递增栈来解决"下一个更小元素"类问题,还可以用于图算法中的拓扑排序等问题。

class MyQueue {
    Deque<Integer> deque = new LinkedList<>();
    //弹出元素时,比较当前要弹出的数值是否等于队列出口的数值,如果相等则弹出
    //同时判断队列当前是否为空
    void poll(int val) {
        if (!deque.isEmpty() && val == deque.peek()) {
            deque.poll();
        }
    }
    //添加元素时,如果要添加的元素大于入口处的元素,就将入口元素弹出
    //保证队列元素单调递减
    //比如此时队列元素3,1,2将要入队,比1大,所以1弹出,此时队列:3,2
    void add(int val) {
        while (!deque.isEmpty() && val > deque.getLast()) {
            deque.removeLast();
        }
        deque.add(val);
    }
    //队列队顶元素始终为最大值
    int peek() {
        return deque.peek();
    }
}

标签:deque,val,元素,栈中,递减,单调
From: https://www.cnblogs.com/chenyi502/p/17256972.html

相关文章

  • POJ-2559-Largest Rectangle in a Histogram-DP或者单调栈
    ProblemE LargestRectangleinaHistogram TimeLimit:2000/1000MS(Java/Others)    MemoryLimit:65536/32768K(Java/Others)TotalSubmission(s):2498......
  • 函数性质与决策单调性
    一些函数性质:一次函数:最大值和最小值在\(x\)的最大值或最小值取到。(引申)反比例函数:最大值和最小值在\(\cfrac{1}{x}\)的最大值或最小值取到。奇/偶函数:对称性。单......
  • 单调队列
       重点:将队列中没有用的元素删除。如果在窗口中存在i<j,ai>aj,那么在窗口向右移动的过程中,只要aj存在,那么ai就永远不可能成为最小值。应该被移除。因此,当窗口移动......
  • 【Linux】Ubuntu系列简单调优
    是不是觉得你的Ubuntu比别人的慢?是不是并发数不够高?是不是启动个服务慢到怀疑人生?下面是我从网上收集回来的Ubuntu系列的简单性能配置,希望能够帮助到更多的人。1.修改/etc/......
  • 代码随想录算法Day37 | 738.单调递增的数字
    738.单调递增的数字题目链接:738.单调递增的数字-力扣(LeetCode)思路将数字转换成字符数组形式,然后从后向前遍历,当遇到当前这个数大于后一个数的时候,这个数减一,他的后一......
  • 单调栈
    一但要求下一个更大的元素,就是用单调栈解,力扣题库相似的题目都是这个解法。栈(stack)是很简单的一种数据结构,先进后出的逻辑顺序,符合某些问题的特点,比如说函数调用栈。单调......
  • 字节青训营主题发文——单调栈
    主题说明现有n个宽度为1的柱子,给出n个非负整数依次表示柱子的高度,排列后如下图所示,此时均匀从上空向下撒青豆,计算按此排列的柱子能接住多少青豆。(不考虑边角堆积)......
  • 最大子序和——单调队列+DP
    输入一个长度为n的整数序列,从中找出一段长度不超过m的连续子序列,使得子序列中所有数的和最大。注意:子序列的长度至少是1。输入格式第一行输入两个整数n,m。第二......
  • P5788 【模板】单调栈
    P5788【模板】单调栈【模板】单调栈题目背景模板题,无背景。2019.12.12更新数据,放宽时限,现在不再卡常了。题目描述给出项数为n的整数数列a_{1...n}。定义函数......
  • acwing 单调栈
    原题给定一个长度为N的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出-1。输入格式第一行包含整数N,表示数列长度。第二行包含N个整数,表示整数数列。......