leetcode221
221. Maximal Square
package leetcode; public class Solution221 extends Solution { @Override public void test() { char[][] matrix = { {'1', '1', '1', '1', '1'}, {'1', '0', '1', '1', '1'}, {'0', '1', '1', '1', '0'}, {'1', '1', '1', '1', '1'}, {'1', '0', '1', '1', '1'}, }; System.out.println(maximalSquare(matrix)); } public int maximalSquare(char[][] matrix) { // f(x, y)是(x, y)为正方形右下角的点时所能构成的最大正方形面积 // 当f(x-1, y-1) != 0时,f(x, y)的取值可以分为两种情况: // (1) 当 f(x-1, y) != f(x, y-1)时, 取两者中的最小值; // (2) 当 f(x-1, y) == f(x, y-1)时,取两者中的最小值,假设f(x, y-1)较小,然后再取f(x-1, y-1)与f(x, y-1)中较小的值 // 将得到的最小值开根号再加1,就是f(x, y)所能构成的最大正方形的边长 if(matrix.length < 1 || matrix[0].length < 1) return 0; int[][] area = new int[matrix.length][matrix[0].length]; int max = 0; for(int i=0; i<matrix.length; i++){ for(int j=0; j<matrix[i].length; j++){ if (matrix[i][j]!='0'){ isSquare(matrix, area, i, j); } max = Math.max(max, area[i][j]); } } return max; } public void isSquare(char[][] matrix, int[][] area, int x, int y){ if (x <= 0 || y <= 0 || area[x-1][y-1] == 0) { area[x][y] = matrix[x][y] - '0'; return ; } int t = Math.min(area[x-1][y], area[x][y-1]); if (area[x - 1][y] == area[x][y - 1]) { t = Math.min(t, Math.abs(area[x - 1][y - 1])); } int sqrt = (int)Math.sqrt(t) + 1; area[x][y] = sqrt * sqrt; } }