資料結構 單調棧與單調佇列

2022-03-29 22:09:08 字數 1750 閱讀 7898

單調棧是棧內元素具有嚴格單調性的一種資料結構。

由於我們要找到每個數左邊第乙個比它小的數,那麼我們便可以發現:

對於棧中任意乙個數,如果在它右邊存在乙個數比它小(或相等),那麼這個數便是不可能被選中的,直接彈出棧即可

於是我們便可以進行如下操作:

按序列舉每乙個數,準備將當前這個數壓棧時,從棧頂開始遍歷,如果棧內當前元素比當前預進棧的數要大(或相等),則符合上述所說的性質,可以直接將其出棧,讓棧頂位置減一。

直到遇到乙個數比當前預進棧的數小,則讓棧頂位置加一,使其入棧。

需要注意的是,為了保證棧內必然存在乙個數比當前預進棧的數要小,也就是為了防止陣列越界,我們可以將棧中下標為0的位置設為-1。

**實現:

#include #include 

#include

using

namespace

std;

const

int n = 1e5+10

;int

n;int

a[n],top;

int find(int

x)

int now=a[top];a[++top]=x;

return

now;

}int

main()

return0;

}

單調棧演算法,每個元素至多入棧一次、出棧一次,故時間複雜度為o(n)。借助單調棧處理問題的思想在於及時排除不可能的選項,保持策略集合的高度有效性和秩序性,從而為我們作出決策提供更多的條件和可能方法。

推薦經典習題:largest rectangle in a histogram (poj2559)

推薦實戰練題:城市遊戲

單調佇列與單調棧類似,是一種佇列內元素具有嚴格單調性的資料結構。

下面以求最大值為例:

對於佇列內每乙個數,如果在其右邊存在乙個比它大的數,則該數一定比其更優,故可將其出隊

我們從左到右列舉序列中的每乙個數,然後執行以下三步操作:

1.如果當前隊首元素下標已經超出了滑動視窗的範圍,則隊首元素出隊。

2.若隊尾元素小於預入隊的數,則不斷刪除隊尾元素,直到隊尾元素的值大於該數,則將其插入隊尾。

3.若當前列舉的數的下標已經大於等於滑動視窗的大小,則可以輸出,當前隊首元素即是最優解。

為了方便起見,我們在佇列中儲存數的下標。

**實現:

#include #include 

using

namespace

std;

const

int n = 1e6 + 10

;int

n,k;

inta[n],q[n];

intmain()

puts(

"");

front=1,back=1

;

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

puts(

"");

return0;

}

單調佇列演算法,每個元素至多入隊一次、出隊一次,故時間複雜度為o(n)。它的思想也是在決策集合(佇列)中及時排除一定不是最優解的選擇。

推薦經典習題:最大子序和 (ch1201)

資料結構 單調棧與單調佇列

830.單調棧 154.滑動視窗 79.滑動視窗的最大值 單調棧的應用場景 求最近的最值 單調佇列的應用場景 求滑動視窗內的最值 單調佇列步驟 值得注意的是單調佇列存的是下標,方便判斷隊頭是否滑出視窗 1.判斷隊頭是否滑出視窗 2.判斷完之後那麼隊頭就是滑動視窗的最值,處理題目邏輯 順序不一定在2,...

模板 資料結構 單調佇列 單調棧

一道例題,給定一串數字,求每連續k個數字的最大 最小值。思路 初始化乙個初始長度為k的單調佇列,按從左到右加入元素,同時滿足這個佇列中的元素是遞減的 也就是假如某個數被兩個距離不超過k的大於他的數夾著,他會被從隊尾調出佇列 得到最大值。向右移動一格,假如隊首離開範圍,出隊。往隊尾加入元素前,把隊尾的...

單調佇列與單調棧

單調棧 單調棧,顧名思義,就是維持單調性 遞增或者遞減 的棧結構,如果新入棧的元素破壞了單調性,就彈出原先棧內元素,直到能夠滿足單調性 用途 它可以很方便地求出某個數的左邊或者右邊第乙個比它大或者小的元素,而且總時間複雜度o n 並且單調棧本身並不難實現 維護 每次入棧前先檢驗入棧後是否會破壞棧的單...