LeetCode第221题:最大正方形(中等)
- 题目:在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。
- 解题思路:想着从最大的正方形开始判断,再将边长依次缩小,但是没过
class Solution {
public int maximalSquare(char[][] matrix) {
int ans = matrix.length;
int len = matrix.length;
int res = 0;
if(len == 0) return 0;
int yy = 0;
int i=0,j=0;
while(ans>1){
while(i<len){
while(j<len){
if(matrix[i][j]=='1'){
if(i+ans>len){
i = 0;
j = 0;
ans--;
}else if(j+ans>len){
i++;
j = 0;
}else{
int k = 1;
int m = 0;
while(i+m<len && m<=ans){
while(j+k<len && k<=ans){
if(matrix[i+m][j+k]=='1'){
res = 1;
if(m==ans && k==ans) return (1+ans)*(1+ans);
k++;
}else{
yy = 1;
ans--;
break;
}
}
if(yy==1) break;
m++;
}
}
}
j++;
}
i++;
}
}
return res==1?(1+ans)*(1+ans):0;
}
}
- 题解做法:min(上, 左, 左上) + 1,利用木桶的短板理论进行动态规划
class Solution {
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];
int[] dp = new int[width + 1];
int northwest = 0; // 西北角、左上角
// for (int row = 0; row < height; row++) {
for (char[] chars : matrix) {
northwest = 0; // 遍历每行时,还原回辅助的原值0
for (int col = 0; col < width; col++) {
int nextNorthwest = dp[col + 1];
if (chars[col] == '1') {
// dp[row + 1][col + 1] = Math.min(Math.min(dp[row + 1][col], dp[row][col + 1]), dp[row][col]) + 1;
dp[col + 1] = Math.min(Math.min(dp[col], dp[col + 1]), northwest) + 1;
// maxSide = Math.max(maxSide, dp[row + 1][col + 1]);
maxSide = Math.max(maxSide, dp[col + 1]);
} else {
dp[col + 1] = 0;
}
northwest = nextNorthwest;
}
}
return maxSide * maxSide;
}
}