利用动态规划,去迭代的求出 下标i j 处,第 i 行 连续1 的长度,第 j 列连续1 的长度。然后借助这两个信息利用update 函数去求面积。
class Solution {
public:
void update(vector<vector<vector<int>>>& recond,int begin_i,int begin_j){
int line_min=recond[begin_i][begin_j][0];
int row=recond[begin_i][begin_j][1];
for(int count=0;count<row;count++){
line_min=min(line_min,recond[begin_i-count][begin_j][0]);
recond[begin_i][begin_j][2]=max(recond[begin_i][begin_j][2],line_min*(count+1));
}
}
int maximalRectangle(vector<vector<char>>& matrix) {
if(!matrix.size()) return 0;
vector<vector<vector<int>>> recond(matrix.size(),vector<vector<int>>(matrix[0].size(),{0,0,0}));
int res=0;
for(int i=0;i<matrix.size();i++){
for(int j=0;j<matrix[0].size();j++){
if(matrix[i][j]=='0') ;
else{
if(i==0&&j==0){
recond[i][j]={1,1,1};
}
else if(i==0) recond[i][j]={recond[i][j-1][0]+1,1,recond[i][j-1][2]+1};
else if( j == 0)
recond[i][j] = {1, recond[i-1][j][1] + 1, recond[i-1][j][2] + 1};
else{
recond[i][j][0] = recond[i][j-1][0] + 1, recond[i][j][1] = recond[i-1][j][1] + 1;
update( recond, i, j);
}
res = max( res, recond[i][j][2]);
}
}
}
return res;
}
};