/* * 221. Maximal Square * 2016-6-12 by Mingyang * 以当前点(x,y) = '1' 为右下角的最大正方形的边长 * d[i][j] = Math.min( Math.min( d[i-1][j], d[i][j-1]), d[i-1][j-1] ) + 1; * 比如那三个前面的都是1,那么我要是1的话,自然而然就是等于2,因为最大的边长为2 * 我跟我左边,我上边,我左斜对角的三个数比较,如果我是0,当然就是0,如果为1,则取三个最小的加1 * https://www.youtube.com/watch?v=_Lf1looyJMU * 这里的dp可以取matrix的长度+1 */ public int maximalSquare(char[][] matrix) { int res=0; int row=matrix.length; if(row==0) return 0; int col=matrix[0].length; int[][] dp=new int[row+1][col+1]; for(int i=0;i<row;i++){ for(int j=0;j<col;j++){ if(matrix[i][j] == '1') { dp[i+1][j+1] = Math.min(Math.min(dp[i][j+1] , dp[i][j]), dp[i+1][j]) + 1; res = Math.max(dp[i+1][j+1], res); // update result } } } return res*res; }