貪心
假設當前點為最大矩陣的右下角,向上擴充套件每次取長度的最小值作為矩陣的長。
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;
for(
int i =
0; i < r;
++i)
int mi = left[i]
[j];
for(
int q = i; q >=0;
--q)
ret =
max(ret, mi*
(i-q+1)
);}}
}return ret;}}
;
單調棧
每次考慮一列,使用單調棧找到第i行j列的最小上邊界和最大下邊界。
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;
vector<
int>
up(r)
,down
(r);
for(
int j =
0; j < c;
++j)
up[i]
= sta.
empty()
?-1: sta.
top();
sta.
push
(i);
} sta = stack<
int>()
;for
(int i = r-
1; i >=0;
--i)
down[i]
= sta.
empty()
? r : sta.
top();
sta.
push
(i);
}for
(int i =
0; i < r;
++i)
}return ret;}}
;
最大矩形 單調棧
在這裡先簡單描述一下單調棧 單調棧 一種線性資料結構,棧內元素自棧頂到棧底滿足單調性。有單調遞增棧和單調遞減棧。如果要加入棧的元素不滿足單調性,則要將棧頂元素彈出,直到滿足條件為止,然後將該元素入棧 作用 給乙個直方圖,求直方圖中的最大矩形的面積。例如,下面這個中直方圖的高度從左到右分別是2,1,4...
最大矩形 單調棧
題目 給乙個直方圖,求直方圖中的最大矩形的面積。例如,下面這個中直方圖的高度從左到右分別是2,1,4,5,1,3,3,他們的寬都是1,其中最大的矩形是陰影部分。輸入包含多組資料。每組資料用乙個整數n來表示直方圖中小矩形的個數,你可以假定1 n 100000.然後接下來n個整數h1,hn,滿足 0 h...
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...