題目
給乙個直方圖,求直方圖中的最大矩形的面積。例如,下面這個中直方圖的高度從左到右分別是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...