在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。
示例:
输入: 1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0 输出: 4
C
int maximalSquare(char** matrix, int matrixRowSize, int matrixColSize)
{
int m=matrixRowSize;
int n=matrixColSize;
if(0==m)
{
return 0;
}
int res=0;
int** tmp=(int**)malloc(sizeof(int*)*m);
for(int i=0;i<m;i++)
{
tmp[i]=(int*)malloc(sizeof(int)*n);
memset(tmp[i],0,sizeof(int)*n);
}
for(int i=0;i<m;i++)
{
if('1'==matrix[i][0])
{
tmp[i][0]=1;
res=1;
}
}
for(int j=0;j<n;j++)
{
if('1'==matrix[0][j])
{
tmp[0][j]=1;
res=1;
}
}
for(int i=1;i<m;i++)
{
for(int j=1;j<n;j++)
{
if('1'==matrix[i][j])
{
char cc=tmp[i-1][j]>tmp[i][j-1]?tmp[i][j-1]:tmp[i-1][j];
tmp[i][j]=(cc>tmp[i-1][j-1]?tmp[i-1][j-1]:cc)+1;
res=res>tmp[i][j]?res:tmp[i][j];
}
}
}
return res*res;
}
C++
class Solution {
public:
int maximalSquare(vector<vector<char>>& matrix)
{
if (matrix.empty())
{
return 0;
}
int m=matrix.size();
int n=matrix[0].size();
int res=0;
vector<vector<int>> tmp(m,vector<int>(n,0));
for(int i=0;i<m;i++)
{
if('1'==matrix[i][0])
{
tmp[i][0]=1;
res=1;
}
}
for(int j=0;j<n;j++)
{
if('1'==matrix[0][j])
{
tmp[0][j]=1;
res=1;
}
}
for(int i=1;i<m;i++)
{
for(int j=1;j<n;j++)
{
if('1'==matrix[i][j])
{
tmp[i][j]=min(min(tmp[i-1][j],tmp[i][j-1]),tmp[i-1][j-1])+1;
res=max(res,tmp[i][j]);
}
}
}
return res*res;
}
};
python
class Solution:
def maximalSquare(self, matrix):
"""
:type matrix: List[List[str]]
:rtype: int
"""
if not matrix:
return 0
m=len(matrix)
n=len(matrix[0])
res=0
tmp=[[0 for j in range(n)] for i in range(m)]
for i in range(m):
if '1'==matrix[i][0]:
tmp[i][0]=1
res=1
for j in range(n):
if '1'==matrix[0][j]:
tmp[0][j]=1
res=1
for i in range(1,m):
for j in range(1,n):
if '1'==matrix[i][j]:
tmp[i][j]=min(min(tmp[i-1][j],tmp[i][j-1]),tmp[i-1][j-1])+1
res=max(res,tmp[i][j])
return res**2