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

    1.定义

    从栈底元素到栈顶元素呈单调递增或单调递减,栈内序列满足单调性的栈;

    2.原理

    (1)当新元素在单调性上优于栈顶时(单增栈新元素比栈顶大,单减栈新元素比栈顶小),压栈,栈深+1;

    (2)当新元素在单调性与栈顶相同(新元素于栈顶相同)或劣于栈顶时(单增栈新元素比栈顶小,单减栈新元素比栈顶大),弹栈,栈深-1;

    3.应用

     1.求最长的单调上升、递减区间

      eg.Loongint的花篮

    如果对于区间[Si,Sj](1<=i<j<=n)中任意的花篮都比Si高且比Sj低,那么这个区间称为一个美学区间。

    如果根本不存在美学区间,输出-1。

    如果存在美学区间,那么如果任意区间的长度都小于等于k,那么输出最大的长度,否则输出最大长度比k大多少(MaxLength-k)。

    2.针对每个数,寻找它和它左 / 右边第一个比它大 / 小的数的值,以及相距多少个数。

      eg..POJ 3250

    有一群牛站成一排,每头牛都是面朝右的,每头牛可以看到他右边身高比他小的牛。给出每头牛的身高,要求每头牛能看到的牛的总数。

    3.左右配对

      eg. Trapping Rain Water

    Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining.

    For example, 
    Given [0,1,0,2,1,0,1,3,2,1,2,1], return 6.

    The above elevation map is represented by array [0,1,0,2,1,0,1,3,2,1,2,1]. In this case, 6 units of rain water (blue section) are being trapped. 

    4.多个区间中的最值 / 某个数为最值的最长区间

      eg.POJ 2796

    给你一段区间,需要你求出(在这段区间之类的最小值*这段区间所有元素之和)的最大值

    5.巧妙运用pop()后宽度的玄学问题:

      1.Largest Rectangle in Histogram

    求直方图中的最大矩阵

    For example,
    Given height = [2,1,5,6,2,3],
    return 10.

      2.POJ 3494(题1的二维版本)

    求仅由0,1组成的矩阵中,全部由1组成的小矩阵的最大面积。

  • 相关阅读:
    输出函数
    curl
    页眉的章名和章名不统一
    水平柱状图
    目录和正文的页码生成
    protobuf的使用
    yarn vue安装
    nvm node的安装
    win安装postman
    机器码
  • 原文地址:https://www.cnblogs.com/Cindy-Chan/p/11203791.html
Copyright © 2011-2022 走看看