leetcode1139. 最大的以 1 为边界的正方形c++
题目
给你一个由若干 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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/largest-1-bordered-square
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
分析
这道题的解决可以从一个点开始向它的周围进行遍历,寻找符合题意的最大正方形。在代码实现中是通过定义一个点是正方形的右下点,求出可能的最大正方形之后在可能值中求得最优解。
代码
class Solution {
public:
int largest1BorderedSquare(vector<vector<int>>& grid) {
int length=grid.size(),width=grid[0].size();
int left[length][width];//某点左边连续1的个数
int up[length][width];//某点上方连续1的个数
for(int i=0;i<length;i++)
{
for(int j=0;j<width;j++)
{
if(j&&grid[i][j-1])left[i][j]=left[i][j-1]+grid[i][j];
else left[i][j]=grid[i][j];
if (i && grid[i-1][j]) up[i][j] = up[i-1][j] + grid[i][j];
else up[i][j] = grid[i][j];
}
}
int res=0;
for(int i=0;i<length;i++)
{
for(int j=0;j<width;j++)
{
if(grid[i][j])
{
int len=min(left[i][j],up[i][j]);//可能的最大值
while(res<len)
{
if(up[i][j-len+1]>=len&&left[i-len+1][j]>=len)//判断可能正方形的左下点和右上点是否符合提议
{
res=len;
break;
}
len--;//缩小可能正方形的大小
}
}
}
}
return res*res;
}
};