顧名思義就是棧裡的元素是單調的。
但是這個怎麼使用呢?怎麼就能是單調的呢?看下面的例題
題目給定乙個長度為n的整數數列,輸出每個數左邊第乙個比它小的數,如果不存在則輸出-1。
輸入樣例:
5輸出樣例:3 4 2 7 5
-1 3 -1 2 2題目意思很容易理解
那麼我們先來看暴力做法,每次取乙個數,與前面的數比較
for
(int i=
0;i}}
我們考慮最壞的情況,當序列為降序序列時,例如:
55的話不進迴圈5 4 3 2 1
4的話與5比較
3與4和5比較
2與3、4和5進行比較
1與2、3、4和5進行比較
觀察我們可以發現,我們就需要取出每個數,然後遍歷一遍這個數之前的所有數。
時間複雜度為o(n^2),oj資料範圍都是n<=1e5,評測機1s內運算資料量是1e8~1e9,我們對1e10的資料量是不能接受的,因此我們需要對做法進行優化。這個時候我們就引入單調棧。
以輸入樣例為例來模擬一下單調棧
3 4 2 7 5
我們順序遍歷,從前往後看
先看3,前面沒有比他小的放入棧中
再看4,然後與棧頂元素比較,發現滿足條件,那麼輸出棧頂元素,然後將4入棧
再看2,同樣與棧頂元素比較,但是棧頂元素比2大,那麼我們就需要pop出棧,然後再與棧頂元素比較,直到找到比2小的元素,或者是棧空時結束,然後我們需要判斷棧是否為空,棧空就輸出-1,棧不空那麼就說明找到了比2小的元素,即輸出棧頂元素,最後將2入棧
再看7,比較棧頂元素,小於棧頂元素,那麼輸入棧頂元素,入棧
最後看5,比較彈出棧頂元素,然後再比較,發現滿足條件,輸出棧頂元素
我們再看一下棧中元素的變化過程
33 4
22 7
2 5
這個時候就會發現棧中的元素是從棧底到棧頂是單調遞增的。這也就是為什麼叫做單調棧!!!
模板**
#include
using
namespace std;
const
int n=
1e5+5;
int a[n]
,stk[n]
,n,tt=0;
intmain()
return0;
}
單調棧 模板 單調棧模板
biu 單調棧主要用於求取左邊第乙個比它大,或者比它小的數。就比如站隊隨便排成一列,可以求到每個人後面第乙個比他高的人。同理可以推廣至右邊,比它矮均可。這就是單調遞增棧 遞減棧,從前至 棧,從後向前入棧的區別了。單調棧比較抽象,非常具有智慧型的想法,可應用的場景相當少,根據幾個經典題目體會它的用法會...
模板 資料結構 單調佇列 單調棧
一道例題,給定一串數字,求每連續k個數字的最大 最小值。思路 初始化乙個初始長度為k的單調佇列,按從左到右加入元素,同時滿足這個佇列中的元素是遞減的 也就是假如某個數被兩個距離不超過k的大於他的數夾著,他會被從隊尾調出佇列 得到最大值。向右移動一格,假如隊首離開範圍,出隊。往隊尾加入元素前,把隊尾的...
POJ 3250 單調棧模板
題意 從左右給你n頭都面向右牛的高度,每頭牛能被左邊的牛看到當且僅當自己的身高比他低且中間沒有障礙物 求每頭牛能看到的牛數量之和 include include include include include include include include include include inclu...