题目描述:
给你一个由若干 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
思路:
1、定义两个二维数组,保存当前位置为顶点的左边和上边的最大长度
2、遍历每个位置,选择左边和上边的较小的值,判断能否构成正方形
3、如果步骤2不能构成正方形,则逐步减小边长的值,判断能否构成
代码:
class Solution {
public:int largest1BorderedSquare(vector<vector<int>>& grid) {int row=grid.size(),col=grid[0].size(),result=0;vector<vector<int>>up(row,vector<int>(col));vector<vector<int>>left(row,vector<int>(col));for(int i=0;i<row;i++){for(int j=0;j<col;j++){if(grid[i][j]){if(i==0&&j==0)up[i][j]=left[i][j]=1;else if(j==0){left[i][j]=left[i-1][j]+1;up[i][j]=grid[i][j];}else if(i==0){up[i][j]=up[i][j-1]+1;left[i][j]=grid[i][j];}else{up[i][j]=up[i][j-1]+1;left[i][j]=left[i-1][j]+1;}}}}int len;for(int i=0;i<row;i++){for(int j=0;j<col;j++){if(i==0||j==0){result=max(result,grid[i][j]);continue;}len=min(left[i][j],up[i][j]);if(len){if(left[i][j-len+1]>=len&&up[i-len+1][j]>=len)result=max(result,len);elsefor(int t=len-1;t>=1;t--)if(left[i][j-t+1]>=t&&up[i-t+1][j]>=t){result=max(result,t);break;}}}}return result*result;}
};