用法及作用:
首先需要明確定義: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 如果棧頂元素大於當...