当前位置: 代码迷 >> 综合 >> 158.(1139)最大的以1为边界的正方形
  详细解决方案

158.(1139)最大的以1为边界的正方形

热度:67   发布时间:2024-02-10 04:28:39.0

题目描述:

给你一个由若干 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;}
};

执行效率:

执行用时:40 ms, 在所有 C++ 提交中击败了51.89%的用户

内存消耗:11.2 MB, 在所有 C++ 提交中击败了57.59%的用户