單調棧演算法 入門 部落格推薦 模板

2022-03-16 20:58:21 字數 1433 閱讀 1639

用法及作用:

首先需要明確定義:1.單調遞增的棧,2.單調遞減的棧

單調遞增的棧:從棧頂到棧底是遞增的,每次壓進去的數要小於棧頂元素,輸出也是單調遞增的,主要是解決最大值的區間問題;

單調遞減的棧:從棧頂到棧底是遞減的,每次壓進去的數要大於棧頂元素,輸出也是單調遞減的,主要是解決最小值的區間問題;

這裡的單調性是否嚴格,要根據實際情況來做決定。

在乙個數列中,單調棧解決的是以某個值為最小(最大)值的最大區間,也就是我們需要知道當以這個值為最小值時,在這個數列中的左右區間是什麼。

//求最小值時的區間,使用單調遞減棧

#include#include#include#include#include#include#include#include#includetypedef long long ll;

using namespace std;

const double esp=1e-6;

const int inf=0x3f3f3f3f;

const int maxn=1e5+7;

ll num[maxn], st[maxn];

int n, top, lt[maxn], rt[maxn];

int main()

if(num[st[top]] == num[i]) lt[i] = lt[st[top]];//很重要的,很巧妙的**

st[++top]=i;//大於等於棧頂的數進棧。

} for(int i=1; i<=n; i++)

printf("%d %d\n", lt[i], rt[i]);

} return 0;

}

//求最大值時的區間,使用單調遞增棧,小於等於棧頂的數進棧

#include#include#include#include#include#include#include#include#includetypedef long long ll;

using namespace std;

const double esp=1e-6;

const int inf=0x3f3f3f3f;

const int maxn=1e5+7;

ll num[maxn], st[maxn];

int n, top, lt[maxn], rt[maxn];

int main()

if(num[st[top]] == num[i])

lt[i] = lt[st[top]];

st[++top]=i;

} for(int i=1; i<=n; i++)

print("%d %d\n", lt[i], rt[i]);

} return 0;

}

單調棧 模板 單調棧模板

biu 單調棧主要用於求取左邊第乙個比它大,或者比它小的數。就比如站隊隨便排成一列,可以求到每個人後面第乙個比他高的人。同理可以推廣至右邊,比它矮均可。這就是單調遞增棧 遞減棧,從前至 棧,從後向前入棧的區別了。單調棧比較抽象,非常具有智慧型的想法,可應用的場景相當少,根據幾個經典題目體會它的用法會...

單調棧模板

顧名思義就是棧裡的元素是單調的。但是這個怎麼使用呢?怎麼就能是單調的呢?看下面的例題 題目給定乙個長度為n的整數數列,輸出每個數左邊第乙個比它小的數,如果不存在則輸出 1。輸入樣例 5 3 4 2 7 5 輸出樣例 1 3 1 2 2 題目意思很容易理解 那麼我們先來看暴力做法,每次取乙個數,與前面...

演算法 單調棧

單調棧 從左往右進行遍歷,如果棧頂元素大於等於當前的元素,直接出棧 while 迴圈 退出while 迴圈兩個條件,棧空,或者棧不為空,此時棧頂元素小於單前元素 if 如果棧不為空,表明棧頂元素小於當前元素,將棧頂元素儲存在當前元素對應下標的陣列中 從右邊向左進行遍歷 while 如果棧頂元素大於當...