算法--------最大正方形(Java版本)

題目

在一個由 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[i][j]數組,dp[i][j]表示在matrix[i][j] 位置,能夠形成正方形的最大邊長。
對於每一個matrix[i][j] ,如果matrix[i][j] 等於0,那麼這個位置能形成的最大正方向就是0.

如果matrix[i][j] 等於1,那麼dp[i][j]的值,和其左上,左,上 三個位置的dp[i][j] 有關。
dp[i][j] = Min(dp[i-1][j]、dp[i][j-1]、dp[i-1][j-1]) + 1
該位置的值,等於左上,左,上 三個位置值裏面最小值加1,加1是因爲當前位置matrix[i][j] 等於1,那麼這個位置的最大邊長就是1,如果說其他三個位置都是1,那麼能夠形成最大的邊長就是1+1 =2 ,如果有一個位置是0,那麼就構不成正方向,就是0,這種情況下最大邊長就是1+0 = 1.

class Solution {
    public int maximalSquare(char[][] matrix) {
        if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
            return 0;
        }

        int [][] dp = new int[matrix.length][matrix[0].length];
        int maxSide = 0;
        int cur = 0;

        for (int i = 0; i < dp.length; i++) {
            for (int j = 0; j < dp[0].length; j++) {
                cur = matrix[i][j] == '0' ? 0 : 1;
                if (cur == 1) {
                    if (i == 0 || j == 0) {
                        dp[i][j] = cur;
                    }else {
                        dp[i][j] = cur + Math.min(Math.min(dp[i -1][j],dp[i][j-1]),dp[i-1][j-1]);
                    }
                    maxSide = Math.max(maxSide,dp[i][j]);
                }
            }
        }

//        for (int[] ints : dp) {
//            System.out.println(Arrays.toString(ints));
//        }
        return maxSide * maxSide;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章