算法介绍:给定一个填充字符0和1的2D矩阵,找到仅包含字符1的最大正方形并返回面积。
示例:
思路:这个题很明显需要使用动态规划来进行,每一个点的元素都是依赖于前一个斜对角的元素能够组成最大的矩形,如果该点的元素为字符1,则假如上一个斜对角的元素能够组成的最大矩形边长为2,那么就要依次访问该点的横纵两行,如果这两行的前两个元素都为字符1,则该点能够组成的最大矩形的边长就加2为3,如果有一个方向的某个节点不为字符1,则停止遍历。最后返回这些矩形里边长最大的平方即可。
代码:
class Solution {
public int maximalSquare(char[][] matrix) {
if(matrix.length==0)
return 0;
int m=matrix.length;
int n=matrix[0].length;
int [][]num=new int [m][n];
int max=0;
for(int i=0;i<n;i++)
{
num[0][i]=matrix[0][i]-'0';
max=max>num[0][i]?max:num[0][i];
}
for(int i=0;i<m;i++)
{
num[i][0]=matrix[i][0]-'0';
max=max>num[i][0]?max:num[i][0];
}
for(int i=1;i<m;i++)
{
for(int j=1;j<n;j++)
{
if(matrix[i][j]=='1')
{
num[i][j]=1;
for(int x=1;x<=num[i-1][j-1];x++)
{
if(matrix[i-x][j]=='1'&&matrix[i][j-x]=='1')
{
num[i][j]++;
}
else
break;
}
max=max>num[i][j]?max:num[i][j];
}
else
num[i][j]=0;
}
}
return max*max;
}
}