在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。
示例:
输入: 1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0 输出: 4
解题思路:
动态规划:
建立一个二维数组dp,dp[i][j]表示以(i, j)位置为右下点坐标所能组成的最大正方形的边长。首先第0行、第0列的值就按原来的第0行、第0列来进行初始化(有1为1,无1为0)。其余位置,只有当当前遍历的位置为字符‘1’时,才会进行更新。更新的值为dp[i-1][j-1], dp[i][j-1],和dp[i-1][j]这三个位置的最小值加上1。
public static int maximalSquare(char[][] matrix) {
if(matrix==null||matrix.length==0||matrix[0].length==0)
return 0;
int m=matrix.length;
int n=matrix[0].length;
int c[][]=new int[m][n];
int num=0;
for (int i = 0; i < c.length; i++) {
for (int j = 0; j < c[i].length; j++) {
if(matrix[i][j]=='1')
num=1;
c[i][j]=matrix[i][j]-'0';
}
}
for (int i = 1; i < matrix.length; i++) {
for (int j = 1; j < matrix[i].length; j++) {
if(matrix[i][j]=='1')
{
if(matrix[i-1][j-1]=='1'&&matrix[i-1][j]=='1'&&matrix[i][j-1]=='1')
{
c[i][j]=Math.min(c[i-1][j-1], Math.min(c[i][j-1],c[i-1][j]))+1;
num=Math.max(c[i][j], num);
}
}
}
}
// for (int i = 0; i < c.length; i++) {
// for (int j = 0; j < c[i].length; j++) {
// System.out.print(c[i][j]+" ");
// }
// System.out.println();
// }
return num*num;
}