题目
给你一个由若干 0 和 1 组成的二维网格 grid,请你找出边界全部由 1 组成的最大 正方形 子网格,并返回该子网格中的元素数量。如果不存在,则返回 0。
样例
题解
预处理每个点左侧和上方连续1的个数
计算以某个点为右下角最大正方形时,记len=min(left[i][j],up[i][j]),k从1到len依次遍历,看看边长为k的正方形是否可行
class Solution
{
public:
int left[110][110];//左边连续1
int up[110][110];//右边连续1
int largest1BorderedSquare(vector<vector<int>>& grid)
{
for(int i=0;i<grid.size();i++)
{
for(int j=0;j<grid[i].size();j++)
{
if(grid[i][j])
{
if(j==0) left[i][j]=1;
else left[i][j]=left[i][j-1]+1;
if(i==0) up[i][j]=1;
else up[i][j]=up[i-1][j]+1;
}
}
}
int res=0;
for(int i=0;i<grid.size();i++)
{
for(int j=0;j<grid[i].size();j++)
{
int len=min(left[i][j],up[i][j]);
for(int k=0;k<len;k++)
{
if(left[i-k][j]>=k+1&&up[i][j-k]>=k+1) res=max(res,k+1);
}
}
}
return res*res;
}
};
时间复杂度为 O ( n 3 ) O(n^3) O(n3)