解法
通过暴力法,一点一点的尝试。
动态规划,一个位置的能构成的最大正方形,是依赖三个位置的。
代码
暴力法
public int maximalSquare(char[][] matrix) { int max=Integer.MIN_VALUE; for(int i=0;i<matrix.length;i++) for(int j=0;j<matrix[0].length;j++) { if(matrix[i][j]=='1') { max=Math.max(max,f(matrix,i,j)); } } return max==Integer.MIN_VALUE?0:max; } public int f(char[][] matrix,int i,int j) { int s=1; while(i+s<matrix.length&&j+s<matrix[0].length&&matrix[i+s][j+s]=='1'){ for(int q=0;q<s;q++) { if(matrix[i+s][j+q]!='1') return s*s; } for(int q=0;q<s;q++) { if(matrix[i+q][j+s]!='1') return s*s; } s++; } return s*s; }
动态规划
public int maximalSquare(char[][] matrix) { if(matrix.length==0) return 0; int[][] dp=new int[matrix.length+1][matrix[0].length+1]; int max=Integer.MIN_VALUE; for(int i=0;i<matrix.length;i++) { for(int j=0;j<matrix[0].length;j++) { if(matrix[i][j]=='1') { int min=Math.min(dp[i][j],dp[i][j+1]); min=Math.min(min,dp[i+1][j])+1; dp[i+1][j+1]=min; max=Math.max(max,dp[i+1][j+1]); } } } return max*max; }