给你一个由若干 0
和 1
组成的二维网格 grid
,请你找出边界全部由 1
组成的最大 正方形 子网格,并返回该子网格中的元素数量。如果不存在,则返回 0
。
示例 1:
输入:grid = [[1,1,1],[1,0,1],[1,1,1]] 输出:9
示例 2:
输入:grid = [[1,1,0,0]] 输出:1
提示:
1 <= grid.length <= 100
1 <= grid[0].length <= 100
grid[i][j]
为0
或1
C++
class Solution {
public:
int largest1BorderedSquare(vector<vector<int>>& grid)
{
int m=grid.size();
int n=grid[0].size();
vector<vector<int>> sumx(m+1,vector<int>(n+1,0));
vector<vector<int>> sumy(m+1,vector<int>(n+1,0));
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
sumx[i][j]=sumx[i][j-1]+grid[i-1][j-1];
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
sumy[j][i]=sumy[j-1][i]+grid[j-1][i-1];
}
}
int k=min(m,n);
int res=0;
while(k>0)
{
for(int i=1;i+k-1<=m;i++)
{
for(int j=1;j+k-1<=n;j++)
{
int up=sumx[i][j+k-1]-sumx[i][j];
int down=sumx[i+k-1][j+k-1]-sumx[i+k-1][j];
int left=sumy[i+k-1][j]-sumy[i][j];
int right=sumy[i+k-1][j+k-1]-sumy[i][j+k-1];
if(up==k-1 && down==k-1 && left==k-1 && right==k-1 && grid[i-1][j-1])
{
return k*k;
}
}
}
k--;
}
return res;
}
};