单调栈

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组成的小矩阵的最大面积。

原文地址:https://www.cnblogs.com/yf2196717/p/14837390.html