在這裡,如果相乘的不是個數而是區間元素的和,那麼就是該問題的變體,其實質是等價的。
如果利用常規演算法,以每乙個為元素為中心左右搜尋,則演算法複雜度為o(n*n),注意到這裡有些元素可能是重複的計算,可以考慮用到動態規劃,可以
利用類似單調遞增(減)棧的東西,儲存之前的值,從而使得演算法複雜度變為o(n);
為了便於寬度累加定義元素的結構為(高度,寬度),高度作為判斷依據構成單調遞減棧,寬度在出棧時進行累加更新。
(1)如果棧為空或者當前元素大於等於棧頂元素的話則直接進棧。
(2)若當前元素小於棧頂元素或者原始序列為空,則棧頂元素執行出棧,並伴隨以下動作:
1)更新所構成矩形的面積值,若大於最大面積值則更新最大值。
2)將棧頂元素的寬度值累加到棧頂下乙個元素的寬度值上。
(3)重複上面步驟,直到原始序列為空,棧為空,則得到最大的面積值
以下為整個演示過程,注意:
(1)括號裡由(高度,寬度)組成,按照上面所說的演算法進行入棧、更新步驟
(1)白色---》黑色表示入棧動作
(2)黑色---》白色表示出棧動作,出棧時需要傳遞寬度值,以及更新當前面積值
(3)紅色表示寬度值和當前面積值的更新
(4)在更新過程中,儲存當前最大的面積值,在棧空時演算法結束。
(5)本例子的順序為1,2,3,1,2
最大矩形 單調棧
在這裡先簡單描述一下單調棧 單調棧 一種線性資料結構,棧內元素自棧頂到棧底滿足單調性。有單調遞增棧和單調遞減棧。如果要加入棧的元素不滿足單調性,則要將棧頂元素彈出,直到滿足條件為止,然後將該元素入棧 作用 給乙個直方圖,求直方圖中的最大矩形的面積。例如,下面這個中直方圖的高度從左到右分別是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...