單調棧與單調佇列很相似。首先棧是後進先出的,單調性指的是嚴格的遞增或者遞減。
單調棧有以下兩個性質:
若是單調遞增棧,則從棧頂到棧底的元素是嚴格遞增的。若是單調遞減棧,則從棧頂到棧底的元素是嚴格遞減的。
越靠近棧頂的元素越後進棧
單調棧與單調佇列不同的地方在於棧只能在棧頂操作,因此一般在應用單調棧的地方不限定它的大小,否則會造成元素無法進棧。
元素進棧過程:對於單調遞增棧,若當前進棧元素為e,從棧頂開始遍歷元素,把小於e或者等於e的元素彈出棧,直接遇到乙個大於e的元素或者棧為空為止,然後再把e壓入棧中。對於單調遞減棧,則每次彈出的是大於e或者等於e的元素。
乙個單調遞增棧的例子:進棧元素分別為3,4,2,6,4,5,2,3
3進棧:(3)
3出棧,4進棧:(4)
2進棧:(4,2)
2出棧,4出棧,6進棧:(6)
4進棧:(6,4)
4出棧,5進棧:(6,5)
2進棧:(6,5,2)
2出棧,3進棧:(6,5,3)
以上左端為棧底,右端為棧頂
佇列是一種先進先出的資料結構,單調指的是數學中的單調性,包括嚴格的遞增或者遞減。
單調佇列指的就是嚴格符合單調性的佇列,它有兩個性質:
對於單調遞增佇列,從隊頭到隊尾的元素在某種比較標準下是嚴格遞增的,比如q(1, 2, 3, 4, 5)。對於單調遞減佇列,從隊頭到隊尾的元素在某種比較標準下是嚴格遞減的,比如q(5, 4, 3, 2, 1)。
排在前面的元素必定比排在後面的元素先進隊
這兩個性質都很簡單,但不能為了符合性質2而破壞性質1,若當前佇列是q(1, 2, 3, 5),下乙個進隊元素是4,則不能把4放到5的前面,變成q(1, 2, 3, 4, 5),這樣就不符合性質2了。
元素的入隊方法:對於單調遞增佇列,設當前準備入隊的元素為e,從隊尾開始把佇列中的元素逐個與e對比,把比e大或者與e相等的元素逐個刪除,直到遇到乙個比e小的元素或者隊列為空為止,然後把當前元素e插入到隊尾。對於單調遞減佇列也是同樣道理,只不過從隊尾刪除的是比e小或者與e相等的元素。
若佇列有大小限制,則每次插入新元素的時候,需要從隊頭開始彈出元素,直到佇列至少有乙個空間留給當前元素。
以下是乙個單調遞增佇列的例子:
佇列大小不能超過3,入隊元素依次為3,2,8,4,5,7,6,43入隊:(3)
3從隊尾出隊,2入隊:(2)
8入隊:(2,8)
8從隊尾出隊,4入隊:(2,4)
5入隊:(2,4,5)
2從隊頭出隊,7入隊:(4,5,7)
7從隊尾出隊,6入隊:(4,5,6)
6從隊尾出隊,5從隊尾出隊,4從隊尾出隊,4入隊:(4)
以上左端為隊頭,右端為隊尾。從隊尾出隊是為了符合性質2,從隊頭出隊是為了符合佇列的大小限制。
部落格原文
count = a[x=0][y=n-1] = 1;
while(countwhile(x+1
while(y-1>
=0 &&!a[x][y-1]) a[x][--y]=++count; //向左
while(x-1>=0 &&!a[x-1][y]) a[--x][y]=++count; //左上
while(y+1
單調棧和單調佇列
最近又在重新刷題,又看到了單調棧和單調佇列的題目,發現當時也就是背一背就過了,沒有領會到精髓,這次看了幾位前輩寫的心得,感覺理解深了一些。傳送門 關鍵 用單調佇列來解決問題,一般都是需要得到當前的某個範圍內的最小值或最大值。就比如滑動視窗中的最大值問題 eg 1,1,2,3,4 5,6,7,7,9 ...
單調棧和單調佇列
本文摘自部落格,歡迎前往部落格以獲得更好的體驗。從名字上就聽的出來,單調棧中存放的資料應該是嚴格單調有序的,具有以下兩個性質。滿足從棧頂到棧底的元素具有嚴格的單調遞增或單調遞減性 滿足棧的後進先出特性,即越靠近棧底的元素越早進棧。單調棧也分為單調遞增棧和單調遞減棧。stackst for 遍歷這個陣...
單調棧和單調佇列
用陣列模擬出單調棧和單調佇列 單調棧常常用來維護離最近的比當前值小或大的值,單調佇列維護乙個固定區間的最小或最大值 單調棧維護乙個左邊比他小的值的 1 include2 using namespace std 3int st 100010 n,a 100010 4 inttt 5int main 6...