Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and return its area.
思路参考 blog
int maximalRectangle(vector<vector<char> > &matrix) {
int res(0);
int rows=matrix.size();
if(rows == 0)
return res;
int cols = matrix[0].size();
int** mat = new int* [rows];
for(int i=0;i<rows;++i)
{
mat[i] = new int[cols];
}
if(mat == nullptr)
return res;
//以行统计每行以1结尾连续1的个数
for(int i=0;i<rows;++i)
{
for(int j=0;j<cols;++j)
{
if(j==0)
{
if(matrix[i][j] == '1')
mat[i][j]=1;
else
mat[i][j]=0;
}else{
if(matrix[i][j] == '0')
mat[i][j]=0;
else
mat[i][j]=mat[i][j-1]+1;
}
}
}
//以列统计mat:对于每一个非0 的mat,从当前这点开始,向上与向下扫描,直到遇到小于当前非0mat的时候停止。同时统计上下扫描的总行数
//针对当前位置所在的最大矩形即为 当前上下扫描的行数*count
for(int j=0;j<cols;++j)
{
for(int i=0;i<rows;++i)
{
if(mat[i][j]!=0)
{
int count(1);
for(int m=i-1;m>=0 && mat[m][j]>=mat[i][j];--m)
{
++count;
}
for(int m=i+1;m<rows && mat[m][j]>=mat[i][j];++m)
{
++count;
}
count = count * mat[i][j];
res = max(res,count);
}
}
}
for(int k=0;k<rows;++k)
delete[] mat[k];
delete[] mat;
return res;
}