package com.anuragkapur.leetcode; import java.util.Arrays; import java.util.HashMap; import java.util.Map; /** * @author anuragkapur */ public class MaximalSquare { Map<String, Integer> areaLookup = new HashMap<>(); public int maximalSquare(char matrix[][]) { if (matrix == null || matrix.length == 0 || matrix[0].length == 0) { return 0; } int maxArea = 0; for (int i=0; i <matrix.length; i++) { for (int j=0; j < matrix[i].length; j++) { int area = (int)Math.pow(maximalSquareLengthFromPoint(matrix, i, j), 2); maxArea = (area > maxArea) ? area : maxArea; } } return maxArea; } private int maximalSquareLengthFromPoint(char matrix[][], int row, int column) { String areaLookupKey = String.valueOf(row)+","+String.valueOf(column); if (areaLookup.containsKey(areaLookupKey)) { return areaLookup.get(areaLookupKey); } if (matrix[row][column] == '0') { return 0; } if (row == matrix.length-1 || column == matrix[0].length-1) { return Character.getNumericValue(matrix[row][column]); } if (matrix[row][column+1] == 0 || matrix[row+1][column+1] == 0 || matrix[row+1][column] == 0) { return 0; } // compute areas of adjoining maximalSquares int area1 = maximalSquareLengthFromPoint(matrix, row, column + 1); int area2 = maximalSquareLengthFromPoint(matrix, row + 1, column + 1); int area3 = maximalSquareLengthFromPoint(matrix, row + 1, column); // maximalSquareLengthFromPoint starting with matrix[i][j]? int areas[] = new int[]{area1, area2, area3}; Arrays.sort(areas); areaLookup.put(areaLookupKey, areas[0]+1); return areas[0]+1; } }