Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and return its area.
用length[i][j]保存点(i, j)的左边横向的连续1的个数(包括自己),用height[i][j]保存点(i, j)的上方竖直的连续1的个数。
然后计算以每个点为右下角的矩形的面积。
int maximalRectangle(vector<vector<char> > &matrix)
{
int lenX = matrix.size();
if (lenX == 0)
return 0;
int lenY = matrix[0].size();
int height[lenX][lenY];
int length[lenX][lenY];
for (int i = 0; i < lenX; i++)
{
for (int j = 0; j < lenY; j++)
{
if (matrix[i][j] == '1')
{
if (j == 0)
length[i][j] = 1;
else
length[i][j] = length[i][j - 1] + 1;
if (i == 0)
height[i][j] = 1;
else
height[i][j] = height[i - 1][j] + 1;
}
else
{
length[i][j] = 0;
height[i][j] = 0;
}
}
}
int max_area = 0;
for (int i = 0; i < lenX; i++)
{
for (int j = 0; j < lenY; j++)
{
int h = height[i][j];
int l = length[i][j];
int minHeight = h;
for (int k = 1; k <= l; k++)
{
minHeight = min(minHeight, height[i][j + 1 - k]);
max_area = max(max_area, k * minHeight);
}
}
}
return max_area;
}