时间复杂度O(M*N),空间复杂度O(N)。
核心思想是:如果存在这样一个最大矩形,那这个矩形可以看成由一列由1组成的线段从左向右扫过所得。
遍历所有这样的线段,即可得到最大的矩形。
下面这段代码是leetcode讨论区上这题最简洁最酷的一段代码。
其中每次H[j],L[j],R[j]分别残留了上一行中该列的线段长度,左边1的位置和右边0(用0是为了方便计算面积)的位置。
注意一些细节,如果为0,则H[j]清零,L[j]和R[j]也必须要初始化为0和n。
计算R[j]的时候顺便把面积给更新了。
class Solution {
public:
int maximalRectangle(vector<vector<char> > &matrix){
if(matrix.size()==0)
return 0;
int n = matrix[0].size();
vector<int> H(n);
vector<int> L(n);
vector<int> R(n,n);
int res = 0;
for(int i=0;i<matrix.size();++i){
int left = 0, right = n;
for(int j=0;j<n;++j){
if(matrix[i][j]=='1'){
++H[j];
L[j] = max(left,L[j]);
}
else{
H[j] = 0; left = j+1; L[j] = 0; R[j] = n;
}
}
for(int j=n-1;j>=0;--j){
if(matrix[i][j]=='1'){
R[j] = min(R[j],right);
res = max(res, (R[j]-L[j])*H[j]);
}
else{
right = j;
}
}
}
return res;
}
};