【leetcode】221. さいだい正方形ダイナミックプランニングほう
1557 ワード
0と1からなる2次元行列内で,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)dp(i,j)の値を計算できれば,その最大値は行列に111しか含まれない正方形の辺長最大値であり,その平方は最大正方形の面積である.
この位置の値が000である場合、dp(i,j)=0 dp(i,j)=0 dp(i,j)=0は、現在の位置が111からなる正方形にあることが不可能であるためである.
この位置の値が111である場合、dp(i,j)dp(i,j)dp(i,j)の値は、その上方、左方、左上の3つの隣接位置のdpdp値によって決定される.具体的には、現在位置の要素値は、3つの隣接位置の要素の最小値プラス111に等しく、状態遷移方程式は以下の通りである.
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))+1
js解法:
/**
* @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 //
};