zoukankan      html  css  js  c++  java
  • 单调栈

    什么是单调栈

    一个从栈顶到栈底元素大小有序的栈

    单调栈的优势

    效率高:每个元素只进栈一次,出栈一次,所以时间复杂度是(O(N)).

    什么时候用单调栈(单调栈的特点)

    单调递增(减)栈举例,对于数组中的某个元素,单调栈能在平均(O(1))的时间找到离自己最近的比自己小(大)的两个元素(左边一个,右边一个),我通常在数组开头和结尾放一个INT_MIN(INT_MAX),这样就不用处理边界情况。

    (递增为例)如何找到离自己最近的比自己的两个元素?

    对于数组元素b,如果栈顶元素t小于b,那么t就是离b最近的左边的小元素,否则弹栈,直到找到小于b的元素,b入栈。这就是说:b入栈时可以得到b左边最近的小元素。

    继续对数组遍历,如果遍历到的元素大于b就压栈,直到某元素c小于b,b出栈。这就是说:b出栈时可以得到b右边最近的小元素。

    典型题目 leetcode 84

    对于某个柱子b,如果我想知道以a的高度为高的最大矩形怎么办?根据上面我们说的,如果用单调递增栈,我们可以快速得到离b最近的且比b的两个柱子(左边为a,右边为c)。得到之后呢?因为a是b左边第一个比b低的柱子,言外之意是,a,b之间的柱子都比b要,既然都比b高,那么就可以作为以b的高度为高的矩形的一部分,右边同理。那么最后,a和c之间的距离就是以b的高度为高的矩形的底边长度。

  • 相关阅读:
    iOS.UI_正则表达式(特殊字符)
    iOS.UI_正则(电话号码)
    iOS远程推送h获取Token
    CoreData教学完整版(封装我们自己的CoreData工具)_Dylan
    Swift基础加强_跟我打500行
    xmpp好友请求5
    XMPP教学小结1
    xmpp好友状态4
    XMPP好友列表3
    XMPP收发消息2
  • 原文地址:https://www.cnblogs.com/rookiezjz/p/12732060.html
Copyright © 2011-2022 走看看