單調棧 C 實現

2021-10-12 07:39:42 字數 1775 閱讀 9405

本人小學雞,寫部落格僅為強化記憶,分享交流,如有錯誤請多指正。

何為單調棧?

顧名思義,就是單調的棧,我們維護乙個棧,棧中的元素保持非嚴格單調遞增或遞減。

此演算法在處理一些問題時莫名其妙(霧)的有效,是乙個典型的空間換時間的演算法。

問題描述

在橫軸上放了n個相鄰的矩形,每個矩形的寬度是1,而第i(1 ≤ i ≤ n)個矩形的高度是hi。這n個矩形構成了乙個直方圖。例如,下圖中六個矩形的高度就分別是3, 1, 6, 5, 2, 3。

請找出能放在給定直方圖裡面積最大的矩形,它的邊要與座標軸平行。對於上面給出的例子,最大矩形如下圖所示的陰影部分,面積是10。

輸入格式

第一行包含乙個整數n,即矩形的數量(1 ≤ n ≤ 1000)。

第二行包含n 個整數h1, h2, … , hn,相鄰的數之間由空格分隔。(1 ≤ hi ≤ 10000)。hi是第i個矩形的高度。

輸出格式

輸出一行,包含乙個整數,即給定直方圖內的最大矩形的面積。

樣例輸入

63 1 6 5 2 3

樣例輸出

10題解

我們可以維持乙個單調遞增的棧,為了便於計算矩形寬度,我們在棧裡存放單個矩形的位置。

我們從左到右遍歷高度陣列,對於每個矩形的高度p,如果p大於等於當前棧頂儲存位置的高度q,我們將p的位置也壓入棧中;

如果p小於q,我們將q彈出,紀錄高度,並記錄當前遍歷到的矩形p與新棧頂位置之差(實際上還需要減1),作為寬度,並更新結果。

為避免棧中剩餘矩形,我們可以在陣列尾插入乙個高度為零的矩形,使棧中所有矩形彈出並更新。

**實現

int

largestrectanglearea

(vector<

int>

& heights)

else

area = area >

(width * height)

? area :

(width * height)

;//更新結果

} indices.

push

(i);

}return area;

}

問題描述題解我們在這裡維持乙個單調遞減的棧,為了便於計算天數差,我們在棧中儲存位置(即日期)。

此題相較上題簡單一些,故不在此贅述。

注意:

此題與上題不同的是,若棧中有剩餘的日期,說明此後沒有更暖和的日期,故無需再彈出。

**實現

vector<

int>

dailytemperatures

(vector<

int>

& t)

indices.

push

(i);

}return ans;

}

單調棧 模板 單調棧模板

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

單調佇列 單調棧

參考文章 單調佇列 poj 2823 給定乙個數列,從左至右輸出每個長度為m的數列段內的最小數和最大數。數列長度 n 106 m n n 106,m n n 106 m n 直接暴力求解複雜度在0 mn 可以考慮維護區間最值,單調佇列則是維護區間佇列的強大 單調佇列的定義 單調佇列實現的大致過程 1...

C 單調棧使用總結

相關leetcode題目 496.下乙個更大元素 i 503.下乙個更大元素 ii 556.下乙個更大元素 iii 31.下乙個排列 739.每日溫度 這類題最終要求的結果都是比當前元素更大的下乙個元素的位置 求解思路 就比如上學做操時的排隊,如果你向後望去一馬平川,說明後面沒有比你更高的人,如果後...