題目描述:算法
在一個二維01矩陣中找到全爲1的最大正方形;spa
1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0
返回 4;code
算法分析:blog
對於給定矩陣matrix[][],能夠創建對應的矩陣DP[][],用DP[i][j]來記錄以點i,j爲右下角的全1矩陣的最大邊長。同時通過分析能夠得出,DP[i][j]的值與DP[i-1][j],DP[i][j-1],DP[i-1][j-1]這三者的值有關:it
①若DP[i-1][j],DP[i][j-1],DP[i-1][j-1]三者中存在0值,則DP[i][j]必定爲0;io
②若DP[i-1][j],DP[i][j-1],DP[i-1][j-1]均不爲0,則DP[i][j]爲三者中的最小值+1,由於三者中的最小值必定爲三者所共有的不含0的部分,不然會形成缺角;class
所以對於某一點(i,j), 若matrix[i][j]=1,則動態規劃表達式爲DP[i][j] = min{DP[i-1][j],DP[i][j-1],DP[i-1][j-1]} + 1;di
代碼:動態規劃
public class Solution { /* * @param matrix: a matrix of 0 and 1 * @return: an integer */ public int maxSquare(int[][] matrix) { // write your code here if(matrix==null){ return 0; } int m = matrix.length; int n = matrix[0].length; int res = 0; int[][] result = new int[m][n]; //矩陣初始化 for(int i=0;i<m;i++){ result[i][0] = matrix[i][0]; res = Math.max(matrix[i][0],res); } for(int j=0;j<n;j++){ result[0][j] = matrix[0][j]; res = Math.max(matrix[0][j],res); } for(int i=1;i<m;i++){ for(int j=1;j<n;j++){ if(matrix[i][j]==1){ result[i][j] = Math.min(result[i-1][j],Math.min(result[i][j-1],result[i-1][j-1]))+1; } res = Math.max(res,result[i][j]); } } return res*res; } }