leetcode-85-Maximal Rectangle

Given a 2D binary matrix filled with 0’s and 1’s, find the largest rectangle containing only 1’s and return its area.

Example:

Input:

[
[“1”,”0”,”1”,”0”,”0”],
[“1”,”0”,”1”,”1”,”1”],
[“1”,”1”,”1”,”1”,”1”],
[“1”,”0”,”0”,”1”,”0”]
]

Output: 6

例如矩阵是下图这样的,结果应该是图中红色区域的面积:

1

一般来说,对这种“棋盘式”的题目可以采用一行一行地遍历。

然后,当遍历到(i, j)的时候,以(i,j)为矩形左上角,能不能形成一个矩形,能不能形成多个矩形?那形成的矩形中,我们能不能找一个最大的呢?

首先,如果(i, j)是0,那肯定没法是矩形了。

如果是1,那么我们怎么找以它为左上角的矩形呢?

4

我们可以试探地从左上角的1所在的列开始,往下数数,然后呢,比如在第一行,例如是蓝色的那个矩形,我们看看在列上,它延伸了多远,这个面积是可以算出来的。然后继续,第二行,例如是那个红色的矩形,再看它延伸到多远,哦,我们知道,比第一行近一些,我们也可以用当前离第一行的行数,乘以延伸的距离,得到当前行表示的矩形面积。但是到了第一个虚线的地方,它远远超过了上面的其他所有行延伸的距离了,注意它的上方都是空心的哦,所以,我们遇到这种情况,计算当前行和左上角1围成的面积的时候,只能取所有前面最小的延伸距离乘以当前离第一行的行数。

当我们在数这个矩形的时候越来越像leetcode_question_84 Largest Rectangle in Histogram这道题了

4

2

一行一行地遍历,每一行相当于question84来处理,最后得出最大地area

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
class Solution {
public:
int largestRectangleArea(int* height, int length) {
stack<int> stk;
int i = 0;
int maxArea = 0;
while(i < length){
if(stk.empty() || height[stk.top()] <= height[i]){
stk.push(i++);
}else {
int t = stk.top();
stk.pop();
int area = height[t] * (stk.empty() ? i : i - stk.top() - 1);
maxArea = maxArea > area ? maxArea : area;
}
}
return maxArea;
}

int maximalRectangle(vector<vector<char> > &matrix) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int m = matrix.size();
if(m == 0)return 0;
int n = matrix[0].size();
if(n == 0)return 0;

int** dp = new int*[m];
for(int i = 0; i < m; ++i){
dp[i] = new int[n+1];
memset(dp[i], 0, sizeof(int)*(n+1));
}

for(int j = 0; j < n; ++j)
if(matrix[0][j] == '1')dp[0][j] = 1;

for(int j = 0; j < n; ++j)
for(int i = 1; i < m; ++i)
if(matrix[i][j] == '1') dp[i][j] = dp[i-1][j] + 1;

int maxarea = 0;
for(int i = 0; i < m; ++i){
int tmp = largestRectangleArea(dp[i],n+1);
if(tmp > maxarea)
maxarea = tmp;
}

for(int i = 0; i < m; ++i)
delete[] dp[i];
delete[] dp;

return maxarea;
}
};
Donate? comment?