4.1(动态规划)
4.1
Lc.221.最大正方形
暴力法
有点难懂
class Solution {
public int maximalSquare(char[][] matrix) {
int maxSide = 0;
int rows = matrix.length, cols = matrix[0].length;
for (int i = 0; i < rows; i++){
for(int j = 0; j < cols; j++){
if (matrix[i][j] == '1'){
maxSide = Math.max(maxSide, 1);
int currentMaxSide = Math.min(rows - i, cols - j);
for (int k = 1; k < currentMaxSide; k++){
boolean flag = true;
if (matrix[i + k][j + k] == '0'){
break;//判断对角线是否为0
}
for (int m = 0; m < k; m++){
if (matrix[i + k][j + m] == '0' || matrix[i + m][j + k] == '0'){
//判断新增的最右列和最下面一行
flag = false;
break;
}
}
if (flag){
maxSide = Math.max(maxSide, k + 1);
}
else {
break;
}
}
}
}
}
int maxSquare = maxSide * maxSide;
return maxSquare;
}
}
动态规划
感觉很难想到
- point1
class Solution {
public int maximalSquare(char[][] matrix) {
int maxSide = 0;
if (matrix == null || matrix.length == 0 || matrix[0].length == 0){
return 0;
}
int rows = matrix.length, cols = matrix[0].length;
int[][] dp = new int[rows][cols];
for (int i = 0; i < rows; i++){
for (int j = 0; j < cols; j++){
if (matrix[i][j] == '1'){
if (i == 0 || j == 0){
dp[i][j] = 1;
}
else{
dp[i][j] = Math.min(Math.min(dp[i - 1][j], dp[i - 1][j - 1]),dp[i][j - 1]) + 1;
}
maxSide = Math.max(maxSide, dp[i][j]);//通过比较排去之前的,筛选出最大值(动态规划)
}
}
}
int maxSquare = maxSide * maxSide;
return maxSquare;
}
}

浙公网安备 33010602011771号