【leetcode】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(i,j)dp(i, j)dp(i,j) 表示以 (i,j)(i, j)(i,j) 爲右下角,且只包含 111 的正方形的邊長最大值。若是咱們能計算出全部 dp(i,j)dp(i, j)dp(i,j) 的值,那麼其中的最大值即爲矩陣中只包含 111 的正方形的邊長最大值,其平方即爲最大正方形的面積。數組

若是該位置的值是 000,則 dp(i,j)=0dp(i, j) = 0dp(i,j)=0,由於當前位置不可能在由 111 組成的正方形中;ide

若是該位置的值是 111,則 dp(i,j)dp(i, j)dp(i,j) 的值由其上方、左方和左上方的三個相鄰位置的 dpdpdp 值決定。具體而言,當前位置的元素值等於三個相鄰位置的元素中的最小值加 111,狀態轉移方程以下:code

dp(i,j)=min(dp(i−1,j),dp(i−1,j−1),dp(i,j−1))+1dp(i, j)=min(dp(i−1, j), dp(i−1, j−1), dp(i, j−1))+1 dp(i,j)=min(dp(i−1,j),dp(i−1,j−1),dp(i,j−1))+1io

js解法:function

/**
 * @param {character[][]} matrix
 * @return {number}
 */
var maximalSquare = function (matrix) {
    if (!matrix.length || !matrix[0].length) return 0
    var maxSlideLen = 0, //記錄最長邊
        dp = Array(matrix.length); //構建dp數組

    for (var i = 0; i < matrix.length; i++) {
        dp[i] = Array(matrix[0].length).fill(0); //填充每一位爲0
        for (let j = 0; j < matrix[0].length; j++) {
            if (matrix[i][j] === 1) {
                if (i === 0 || j === 0) {
                    dp[i][j] = 1; // 第一列和第一行的dp值爲1
                } else {
                    dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]) + 1 //判斷左上,左下,右上是否有0
                }
                maxSlideLen = Math.max(maxSlideLen, dp[i][j]) //更新最大邊長
            }
        }
    }
    return maxSlideLen ** 2 //求最大邊長面積
};
相關文章
相關標籤/搜索