Given a 2D binary matrix filled with 0's and 1's, find the largest square containing only 1's and return its area.
For example, given the following matrix:
1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0
Return 4.
题意:
找出全是1的面积最大的正方形,求它的面积。
思路:
如果硬做的话,时间复杂度肯定太大了,过不了。但是动态规划又想不出。首先,对于右下角是'1'的正方形,必然它左边的点和上边的点以及左上角的点可以构成边长少1的正方形,如果组成不了,那么它也组成不了。对于右下角为0的,它肯定不是正方形的右下角。
所以可以得到状态转移方程:dp[i][j]=Math.min(Math.min(dp[i-1][j],dp[i][j-1]),dp[i-1][j-1])+1;
对于边界需要特殊处理,单独判断。
代码:
class Solution {
public int maximalSquare(char[][] matrix) {
int c=matrix.length;
if(c==0)
return 0;
int r=matrix[0].length;
int [][]dp=new int[c][r];
int maxn=0;
for(int i=0;i<c;i++)
{
if(matrix[i][0]=='1')
{
maxn=1;
dp[i][0]=1;
}
}
for(int i=0;i<r;i++)
{
if(matrix[0][i]=='1')
{
maxn=1;
dp[0][i]=1;
}
}
for(int i=1;i<c;i++)
{
for(int j=1;j<r;j++)
{
if(matrix[i][j]=='0')
dp[i][j]=0;
else
dp[i][j]=Math.min(Math.min(dp[i-1][j],dp[i][j-1]),dp[i-1][j-1])+1;
maxn=Math.max(maxn,dp[i][j]);
}
}
return maxn*maxn;
}
}