貪心 單調棧 最大矩形

2021-10-12 23:17:56 字數 1446 閱讀 8793

貪心

假設當前點為最大矩陣的右下角,向上擴充套件每次取長度的最小值作為矩陣的長。

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...