1. 题目描述
给你一个由若干 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2.代码如下
int max(int a,int b)
{
return a<b?b:a;
}
int min(int a,int b)
{
return a<b?a:b;
}
//给定矩形grid,判断矩形grid中,以(istart,jstart)为左顶点,宽为length的未知是否边全为1的正方,判断该正方形的边是否全为1.
int judgesquare(int istart,int jstart,int length,int **grid)
{
for (int i = 0;i < length;i++)//一趟扫描判断四个点,这是由正方形的坐标规律的来的
{
if (grid[i+istart][jstart] != 1)
{
return 0;
}
if (grid[istart][i+jstart] != 1)
{
return 0;
}
if (grid[istart+length-1][i+jstart] != 1)
{
return 0;
}
if (grid[i+istart][jstart+length-1] != 1)
{
return 0;
}
}
return 1;
}
//先暴力解一下
int largest1BorderedSquare(int** grid, int gridSize, int* gridColSize)
{
int maxgrid = 0;
int tmpgrid = 0;
int start = 0;
int res = 0;
int colsize = *gridColSize;
int maymaxlen = min(gridSize,colsize);//先找出可能构成的最大正方形的边长
for (int i = 0;i < gridSize;i++)
{
for (int j = 0;j < colsize;j++)
{
tmpgrid = 0;//逐个处理每个点为正方形的左顶点时的边长大小的增长
if (grid[i][j] == 0)//该左顶点点就不符合条件直接跳出本次判断
{
continue;
}
tmpgrid++;
maxgrid = max(maxgrid,tmpgrid*tmpgrid);//此顶点符合,那么最少此顶点构成的正方形是合法的,所以先计算一次最大的正方形
for (int k = 1;k < maymaxlen;k++)//
{
if ((i+k) >= gridSize || (j+k) >= colsize)//避免超过grid的边界
{
break;
}
res =judgesquare(i,j,k+1,grid);
if (res == 0)
{
tmpgrid++;
continue;//为什么是continue?因为,当前非左顶点的点等于0,只能说明不可能以它为一个正方形的边,但是它可能是被一个"合格“的正方形的包围在内。
}
else
{
tmpgrid++;
maxgrid = max(maxgrid,tmpgrid*tmpgrid);//更新最大的正方形包含的元素数
}
}
}
}
return maxgrid;
}