最大矩形 單調棧

2021-10-04 04:49:34 字數 1631 閱讀 5705

題目

給乙個直方圖,求直方圖中的最大矩形的面積。例如,下面這個中直方圖的高度從左到右分別是2, 1, 4, 5, 1, 3, 3, 他們的寬都是1,其中最大的矩形是陰影部分。

輸入包含多組資料。每組資料用乙個整數n來表示直方圖中小矩形的個數,你可以假定1 <= n <= 100000. 然後接下來n個整數h1, …, hn, 滿足 0 <= hi <= 1000000000. 這些數字表示直方圖中從左到右每個小矩形的高度,每個小矩形的寬度為1。 測試資料以0結尾。

output

對於每組測試資料輸出一行乙個整數表示答案。

sample input

7 2 1 4 5 1 3 3

4 1000 1000 1000 1000

0sample output

84000

解題思路

1.使用單調棧: 單調棧是時刻維護乙個單調的棧,如果新加入的數使得 棧裡 不滿足單調條件了 ,那麼就要 pop 到滿足單調條件為止。

2.使用陣列記錄第 i 個柱子左邊第乙個矮於它的以及右邊第乙個矮於它的,如果最後棧有剩下,那麼說明它可以一路通向左或右,那麼將他們賦值最左或最右。

3.求出面積。

**實現

#include

#include

using

namespace std;

const

int max =

100100

;long

long a[max]

;int st[max]

;//裝的是index

int l[max]

;//裝 i 柱 的左邊第乙個矮於 i柱的index

int r[max]

;//裝 i 柱 的右邊第乙個矮於 i柱的index

int n;

template

<

class

t>

t find_right()

st[++top]

= i;

}while

( top >=0)

}template

<

class

t>

t find_left()

st[++top]

= i;

}while

( top >=0)

}int

main()

printf

("%lld\n"

,max_sum )

;for

(long

long i=

0;i< n ;i++)}

return0;

}

小結實現了單調棧的使用,我之前有錯誤,因為對棧裡剩下的元素沒處理好,其實沒那麼好寫,因為 對數值的控制很麻煩,一不小心就錯了 。

最大矩形 單調棧

在這裡先簡單描述一下單調棧 單調棧 一種線性資料結構,棧內元素自棧頂到棧底滿足單調性。有單調遞增棧和單調遞減棧。如果要加入棧的元素不滿足單調性,則要將棧頂元素彈出,直到滿足條件為止,然後將該元素入棧 作用 給乙個直方圖,求直方圖中的最大矩形的面積。例如,下面這個中直方圖的高度從左到右分別是2,1,4...

貪心 單調棧 最大矩形

貪心 假設當前點為最大矩陣的右下角,向上擴充套件每次取長度的最小值作為矩陣的長。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...

85 最大矩形(單調棧)

給定乙個僅包含 0 和 1 的二維二進位制矩陣,找出只包含 1 的最大矩形,並返回其面積。輸入 1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0 輸出 6這個題可以看成上一題 84.柱狀圖中最大的矩形 單調棧 的拓展,我們一行一行的來分析這個矩陣 第一行 1,0,1,0...