單調棧也是演算法題中常用的一種方法,這裡總結一下思路雖然題目的難度為hard,但是思路還是很好想到的,難點在於優化的部分。
我們可以遍歷每根柱子 i ,並且以當前柱子的高度 height[i] 作為此矩形 rectangle[i] 的高(假設矩形的高為豎直方向的,寬為水平方向)。對於此矩形的寬 width[i] ,我們可以以當前柱子為起始點,向左遍歷每個柱子j,如果 height[j] > height[i] ,則 width[i] +1,一直找到第乙個小於height[i]的柱子j0。右側同理。
空間複雜度o(1),時間複雜度o(n^2)
很遺憾,用時超限了,因為時間複雜度過高。
那麼我們可不可以在遍歷到某個柱子 i 時,僅通過o(1)的方式來找到左側和右側兩個臨界值(左邊界和右邊界)呢?這裡就要用到單調棧。
單調棧分為單調遞增棧和單調遞減棧。
對於單調遞增棧,當我們遍歷陣列時,如果遍歷的元素x大於棧頂元素y時,把x壓入棧;如果x小於y,則將y出棧,如果y出棧後下乙個棧頂元素z依然大於x,則繼續出棧,一直找到第乙個小於x的元素,隨後將x壓入棧中。單調遞減棧同理。
因此,對於上乙個例題中,我們只需要維持乙個柱子高度的單調遞增棧,就可以大大縮減演算法的執行時間。
對於例子[2,1,5,6,2,3],這裡為了**簡便,在柱體陣列的頭和尾加了兩個高度為 0 的柱體。[0,2,1,5,6,2,3,0]
對應下圖可能會更好理解
最大矩形 單調棧
在這裡先簡單描述一下單調棧 單調棧 一種線性資料結構,棧內元素自棧頂到棧底滿足單調性。有單調遞增棧和單調遞減棧。如果要加入棧的元素不滿足單調性,則要將棧頂元素彈出,直到滿足條件為止,然後將該元素入棧 作用 給乙個直方圖,求直方圖中的最大矩形的面積。例如,下面這個中直方圖的高度從左到右分別是2,1,4...
最大矩形 單調棧
題目 給乙個直方圖,求直方圖中的最大矩形的面積。例如,下面這個中直方圖的高度從左到右分別是2,1,4,5,1,3,3,他們的寬都是1,其中最大的矩形是陰影部分。輸入包含多組資料。每組資料用乙個整數n來表示直方圖中小矩形的個數,你可以假定1 n 100000.然後接下來n個整數h1,hn,滿足 0 h...
貪心 單調棧 最大矩形
貪心 假設當前點為最大矩陣的右下角,向上擴充套件每次取長度的最小值作為矩陣的長。class solution int r matrix.size c matrix 0 size vectorint left r,vector int c,0 for int i 0 i r i int ret 0 f...