Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and return its area.
给定一个二维矩阵,里面全是0和1,找出包含全1的最大子矩阵
朴素的思路就是,遍历二维矩阵,找到一个1,就去最大扩展成矩形....这个复杂度略高
这里我们来动规求解。首先降低维度,对于每一个元素,计算其前面有多少个1,也即可以组成的高为1的矩阵长度。
保存这些信息之后,遍历二维数组,上下扫描看是否可以扩展,记录和更新可以扩展的最大面积
class Solution {
public:
int maximalRectangle(vector<vector<char> > &matrix) {
// Note: The Solution object is instantiated only once and is reused by each test case.
int **len;
if(matrix.size() == 0) return 0;
int rows = matrix.size();
int cols = matrix[0].size();
len = new int*[rows];
for(int i = 0 ; i < rows; i++) len[i] = new int[cols];
for(int i = 0; i < rows; i++) {
for(int j = 0; j < cols; j++) {
if(j == 0) {
if(matrix[i][j] == '0') len[i][j] = 0;
else len[i][j] = 1;
}
else {
if(matrix[i][j] == '0') len[i][j] = 0;
else len[i][j] = len[i][j-1]+1;
}
}
}
int maxArea = 0;
int curArea = 0;
for(int i = 0; i < rows; i++) {
for(int j = 0; j < cols; j++) {
if(matrix[i][j] == '1') {
curArea = len[i][j];
for(int k = i-1; k >= 0; k--) {
if(len[k][j] < len[i][j]) break;
curArea += len[i][j];
}
for(int k = i+1; k < rows; k++) {
if(len[k][j] < len[i][j]) break;
curArea += len[i][j];
}
if(maxArea < curArea) maxArea = curArea;
}
}
}
return maxArea;
}
};