在一个由 ‘0’ 和 ‘1’ 组成的二维矩阵内,找到只包含 ‘1’ 的最大正方形,并返回其面积。
int maximalSquare(char** matrix, int matrixSize, int* matrixColSize){
int row = matrixSize;
int line = matrixColSize[0];
if(row == 1 && line == 1)
{
return matrix[0][0] == '1';
}
int dp[row][line];
memset(dp, 0, sizeof(dp));
for(int i = 0; i < row; i++)
{
dp[i][0] = matrix[i][0] == '1' ? 1 : 0;
}
for(int i = 0; i < row; i++) //找到每行中连续的1的相加值
{
for(int j = 1; j < line; j++)
{
dp[i][j] = matrix[i][j] == '0' ? 0 : dp[i][j-1] + 1;
}
}
int max = 0;
int lineSize = 0;
int maxSize = 0;
for(int i = 0; i < row; i++)
{
for(int j = 0; j < line; j++)
{
if(dp[i][j] == 0)
{
continue;
}
lineSize = dp[i][j];
maxSize = lineSize == 0 ? 0 : 1;
for(int k = i-1; k >= 0; k--)
{
if(dp[k][j] == 0)
{
break;
}
lineSize = dp[k][j] > lineSize ? lineSize : dp[k][j];
if(lineSize >= (i-k+1)) //能成正方形则相乘
{
maxSize = (i-k+1) * (i-k+1) > maxSize ? (i-k+1) * (i-k+1) : maxSize;
}
}
max = max > maxSize ? max : maxSize; //找到最大值
}
}
return max;
}
思路:动态规划
先找到每行中的连续的1值的相加值,dp[i][j] 表示在坐标(i,j)前面的可以连成1的值的相加值
然后遍历每行每列,不断向上寻找正方形,记录找到的最大值