記事のディレクトリ
導入
この質問は、最大の広場が221本です。
0と1からなる2次元マトリクス状に、最大正方形は1つだけが含まれ、その面積を返す検索します。
例:
入力:
。1 1 0 0
1 0 1 1 1
1 1 1 1 1
1 1 0 0 0。
出力:4
明らかに解決策を見つけることは容易で動的計画法、動的計画方程式ではなく、を使用することです。
221問題の最大の二乗解
理解分(上、左、左上)+ 1
で述べたように、次の形式のコードに関連する問題:
if (grid(i, j) == 1) {
dp(i, j) = min(dp(i-1, j), dp(i, j-1), dp(i-1, j-1)) + 1;
}
中国語に翻訳:
正方形上、正方形又は左の左上、最小のものに加え、このボックスに正方形:グリッドが1である場合、これは、正方形の右下隅、最大辺の長さです。
精巧なコンセンサスにまずシンプル:
- フォームは、正方形(非単1)は、現在の右下隅の視点で見ている場合は、次のものが必要です。現在のグリッドを、左側に、左上の1であります
- 現在のグリッド、左側に、左上が正方形になるために0を制限することができません:それは別の角度かもしれ
直接地図上で理解しやすい:
それはちょうど短いバレルプレート理論として、交差点の四角の3(上段左、左、上)側を取ること、です。
以下のように、この質問のコードは次のとおりです。
public int maximalSquare(char[][] matrix) {
// base condition
if (matrix == null || matrix.length < 1 || matrix[0].length < 1) return 0;
int height = matrix.length;
int width = matrix[0].length;
int maxSide = 0;
// 相当于已经预处理新增第一行、第一列均为0
int[][] dp = new int[height + 1][width + 1];
for (int row = 0; row < height; row++) {
for (int col = 0; col < width; col++) {
if (matrix[row][col] == '1') {
dp[row + 1][col + 1] = Math.min(Math.min(dp[row + 1][col], dp[row][col + 1]), dp[row][col]) + 1;
maxSide = Math.max(maxSide, dp[row + 1][col + 1]);
}
}
}
return maxSide * maxSide;
}
同様に、タイトルを見て:1277統計はすべて正方形のサブマトリクス1です、まだ同じアイデアを使用しています。
コードは以下の通りであります:
class Solution {
public int countSquares(int[][] matrix) {
if (matrix==null||matrix.length==0||matrix[0].length==0) return 0;
int row=matrix.length;
int col=matrix[0].length;
int count=0;
int[][] dp=new int[row+1][col+1];
for(int i=0;i<row;i++){
for(int j=0;j<col;j++){
if(matrix[i][j]==1){
dp[i+1][j+1]=Math.min(Math.min(dp[i+1][j],dp[i][j+1]),dp[i][j])+1;
count+=dp[i+1][j+1];
}
}
}
return count;
}
}
ここで使用されるようにcount+=dp[i+1][j+1];
、この場合は正しいと考えることができる理由を考えますか?
そのような入力として:マトリックス=
[
[0、1,1,1]、
[1、1,1,1]、
[0、1,1、1
]
]
私たちはどのように行う多くの正方形追加し、新しいものの右下隅に参加しますか?3、DPのちょうど辺の長さ。