题目
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/981308603341ef705b330e571fff2141.png)
思路
- 感觉这道题有点难,不太能够想出来,关键还要求这是正方形,如果只是找只包含1的矩形的最大面积可能会容易一点,滑动窗口的话太暴力了,润去题解。
- 创建一个dp数组,记住dp[i][j]是以matrix[i-1][j-1]为右下角的正方形的最大边长
- 动态转移方程为:dp(i, j) = min(dp(i - 1, j), dp(i, j - 1), dp(i - 1, j - 1)) + 1;
- 假如当前的值为1,说明当前值已经有成为正方形的条件了,必须要求出以其上 左 左上 为右下角的正方向的边长,假设左为最大,如果取它的话,很明显往上和左上延伸是无法找到正方形的,所以必须要取最小的哪一个。
代码
public int maximalSquare(char[][] matrix) {
int[][] dp = new int[matrix.length][matrix[0].length];
int ans=Integer.MIN_VALUE;
for(int i=0;i<matrix.length;i++){
dp[i][0]=matrix[i][0]=='1'?1:0;
if(dp[i][0]*dp[i][0]>ans) ans = dp[i][0]*dp[i][0];
}
for(int i=0;i<matrix[0].length;i++) {
dp[0][i] = matrix[0][i] == '1' ? 1 : 0;
if(dp[0][i]*dp[0][i]>ans) ans = dp[0][i]*dp[0][i];
}
for(int i=1;i<matrix.length;i++){
for(int j=1;j<matrix[0].length;j++){
if(matrix[i][j]=='0') dp[i][j]=0;
else dp[i][j] = Math.min(dp[i-1][j], Math.min(dp[i][j-1], dp[i-1][j-1]))+ 1;
if(dp[i][j]*dp[i][j]>ans) ans = dp[i][j]*dp[i][j];
}
}
return ans;
}