221. Maximal Square
思路
初始化:
1.第一行第一列,初始化成和原grid一样的值。因为他们要么构成边长为1的square,要么就不能
2. 然后余下的各自,从下往上从左往右走,如果这个格子是0,肯定不仅构不成,而且终结了以前的sqaure就是0,
如果是1,值就是左侧、上方和斜对角值中最小的一个+1.
画个图理解,比如三个值,有任意一个为0的时候,都没办法画出更大的方形,最多是1.
X 口 口 X 口口
口 ? 口 ? X ?
哈哈超烂的图,但是说明三者只要有一个为0,那么右下角就肯对最多是1
如果三者都不为0的话,边长至少为1,也就是说 口口 这个形状至少连起来的,但是对于这个大小的,都只能由最小的那个决定了,可以画图多试试。挺明显了。
口X
1 public int maximalSquare(char[][] matrix) { 2 if(matrix.length == 0 || matrix[0].length == 0) { 3 return 0; 4 } 5 int row = matrix.length; 6 int col = matrix[0].length; 7 int max = 0; 8 int[][] res = new int[row][col]; 9 for(int i = 0; i < row; i++) { 10 res[i][0] = (matrix[i][0] == '1')? 1:0; 11 if(res[i][0] > 0) { 12 max = 1; 13 } 14 } 15 for(int i = 0; i< col; i++) { 16 res[0][i] = (matrix[0][i] == '1')? 1:0; 17 if(res[0][i] > 0) { 18 max = 1; 19 } 20 } 21 for(int i = 1; i < row; i++) { 22 for(int j = 1; j < col; j++) { 23 if(matrix[i][j] == '1') { 24 res[i][j] = Math.min(Math.min(res[i-1][j], res[i-1][j-1]), res[i][j-1]) + 1; 25 if(res[i][j] > max) { 26 max = res[i][j]; 27 } 28 } 29 } 30 } 31 return max * max; 32 }