示例: 輸入: 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 //求最大邊長面積 };