题目
在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。
示例:
输入: 1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0 输出: 4
分析
假设 f [ i ][ j ]是 以( i , j )为右下角的 最大正方形边长
如果:
(1)( i , j )位置为0,那么包含这个点的正方形都不符合条件(只包含 1),也就是说f [ i ][ j ]一定会等于0;
(2)( i , j )位置为1,那么包含这个点的正方形的最大边长(即f [ i ][ j ]),应该考虑 左边相邻的点、上面相邻的点、左上方第一个点的最大正方形边长,即f [ i ][ j-1 ]、f [ i-1 ][ j ]、f [ i-1 ][ j-1 ], 即f [ i ][ j ]=1+min( f [ i ][ j-1 ],f [ i-1 ][ j ],f [ i-1 ][ j-1 ]),为什么是取三个f中的最小值是因为,每个f代表对应的正方形,需要取这三个正方形的交集,才能把点( i , j )包含进去,这里不太好解释,可以自己画个图就清楚了。
Java实现
class Solution {
public int maximalSquare(char[][] matrix) {
if (matrix.length==0){
return 0;
}
int n=matrix.length;
int m=matrix[0].length;
int[][] f=new int[n][m];
int res=0;
for (int i=0;i<n;i++){
for (int j=0;j<m;j++){
if (matrix[i][j]=='0'){
f[i][j]=0;
}else {
f[i][j]=1;
if (i>0&&j>0){
f[i][j]+=Math.min(Math.min(f[i-1][j],f[i-1][j-1]),f[i][j-1]);
}
res=Math.max(res,f[i][j]);
}
}
}
return res*res;
}
}
测试
68 / 68 个通过测试用例
状态:通过
执行用时:7 ms