【面試刷題-力扣經典】動規:221. 最大正方形

【題目】

在一個由 0 和 1 組成的二維矩陣內,找到只包含 1 的最大正方形,並返回其面積。

輸入:

1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0

輸出: 4

【思路】

dp[x][y] 代表的是正方形的最右下角是x,y的時候,正方形的邊長

從 (0,0)(0,0) 開始,對原始矩陣中的每一個 1,我們將當前元素的值更新爲
在這裏插入圖片描述在這裏插入圖片描述

(1,3) 處的 2 表示到該索引爲止有個邊長爲 2 的正方形。同樣的,(1,2)(1,2) 和 (2,2)(2,2) 處的 2 也表示到該索引爲止有邊長爲 2 的正方形。到了 (3,3)(3,3),原始矩陣中 (3,3)(3,3) 中的 1,形成了邊長爲 3 的正方形,所以在 (3,3)(3,3) 中應該爲 3。

現在考慮索引 (3,4)(3,4) 的情況,到 (3,4)(3,4) 所能形成的最大正方形爲 2,所以 (3,4)(3,4) 應爲 2。

【代碼】

class Solution {
    public int maximalSquare(char[][] matrix) {
        int m,n,i,j,max;
        if (matrix==null || matrix.length==0 || matrix[0].length==0) return 0;

        m = matrix.length;
        n = matrix[0].length;

        int[][] dp =  new int[m][n];
        max = 0;
        for (i=0; i<m; i++) {
            for (j=0; j<n; j++) {
                if (matrix[i][j]=='1') {
                    dp[i][j] = 1;
                    max = 1;
                }
            }
        }

        for (i=1; i<m; i++) {
            for (j=1; j<n; j++) {
                if (matrix[i][j]=='1') {
                    dp[i][j] = Math.min(Math.min(dp[i-1][j],dp[i][j-1]),dp[i-1][j-1])+1;
                    if (max < dp[i][j]) max = dp[i][j];
                }
            }
        }

        return max*max;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章