LintCode刷題——最大正方形

題目描述:算法

在一個二維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;
    }
}    
相關文章
相關標籤/搜索