221. Maximal Square java solutions
Given a 2D binary matrix filled with 0's and 1's, find the largest square containing all 1's and return its area.
For example, given the following matrix:
1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0
Return 4.
Credits:
Special thanks to @Freezen for adding this problem and creating all test cases.
题目是要找出元素全为1 的最大正方形。使用DP,递推式为:
dp[i][j] = Math.min(dp[i-1][j],Math.min(dp[i][j-1],dp[i-1][j-1])) + 1;
dp[i][j] 表示到该位置出现的正方形的边长,dp[i][j] 要构成一个新的正方形,只能从之前的左边,上边,左上 三个里面取边长最小的加上matrix[i][j] 为1 的情况,即边长+1.
1 public class Solution { 2 public int maximalSquare(char[][] matrix) { 3 if(matrix == null || matrix.length == 0 || matrix[0].length == 0) return 0; 4 int m = matrix.length,n = matrix[0].length; 5 int[][] dp = new int[m][n]; 6 int len = 0; 7 for(int i = 0; i<m; i++){ 8 if(matrix[i][0] == '1'){ 9 dp[i][0] = 1; 10 len = 1; 11 } 12 } 13 for(int i = 0; i<n; i++){ 14 if(matrix[0][i] == '1'){ 15 dp[0][i] = 1; 16 len = 1; 17 } 18 } 19 for(int i = 1; i < m; i++){ 20 for(int j = 1; j < n; j++){ 21 if(matrix[i][j] == '1'){ 22 dp[i][j] = Math.min(dp[i-1][j],Math.min(dp[i][j-1],dp[i-1][j-1])) + 1; 23 len = dp[i][j] > len ? dp[i][j] : len; 24 } 25 } 26 } 27 return len*len; 28 } 29 }