首先计算矩阵的每一行,存入二维数组mmap中,代表着从左到右到这个点为止的最大连续的1的个数为多少。
然后计算mmap中存储的值,计算每一个点,以当前点为基准,向上寻找,向下寻找,寻找大于等于当前mmap点中的值,如果大于,就代表连续的1个个数大于等于当前点,那么就说明可以和当前行凑成一个矩形。最后得出最大值。
class Solution {
public:
int maximalRectangle(vector<vector<char>>& matrix) {
if(matrix.empty()) return 0;
vector<vector<int>> mmap(matrix.size(),vector<int>(matrix[0].size()));
int maxn = 0;
for(int i = 0;i<matrix.size();i++)
{
int cnt = 0;
for(int j = 0;j<matrix[i].size();j++)
{
if(matrix[i][j] == '1')
{
cnt++;
mmap[i][j] = cnt;
}
else if(matrix[i][j] == '0')
cnt=0;
}
}
for(int i = 0;i<matrix.size();++i)
{
for(int j = 0;j<matrix[i].size();++j)
{
if(mmap[i][j] == 0) continue;
int area = mmap[i][j];
for(int k = i-1;k>=0;k--)
{
if(mmap[k][j] < mmap[i][j])
break;
else
area += mmap[i][j];
}
for(int k = i+1;k<matrix.size();k++)
{
if(mmap[k][j] < mmap[i][j])
break;
else
area += mmap[i][j];
}
maxn = maxn>area?maxn:area;
}
}
return maxn;
}
};