leetcode 1139. 最大的以 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

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;
    }
};

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值