首页 > 其他分享 >1139. 最大的以 1 为边界的正方形

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

时间:2023-04-07 21:56:05浏览次数:50  
标签:1139 right 边界 int 复杂度 down 正方形 grid

题目链接:1139. 最大的以 1 为边界的正方形

方法:二维数组前缀和

解题思路

假设以 \((i, j)\) 为左上角端点的正方形网格边长为 \(d\),则该正方形的四条边 \(up、down、left、right\) 均为\(d\),两者为充分必要条件。根据二维前缀和运算可得:

up = s[i][j + d] - s[i - 1][j + d] - s[i][j - 1] + s[i - 1][j - 1];
down = s[i + d][j + d] - s[i + d - 1][j + d] - s[i + d][j - 1] + s[i + d - 1][j - 1];
left = s[i + d][j] - s[i + d][j - 1] - s[i - 1][j] + s[i - 1][j - 1];
right = s[i + d][j + d] - s[i + d][j + d - 1] - s[i - 1][j + d] + s[i - 1][j + d - 1];
// 即满足 up == d && down == d && left == d && right == d

由于要求 \(d\) 最大,则从大到小遍历 \(d\),再遍历网格中的点,若存在符合条件的点,返回当前网格元素数量。

代码

class Solution {
public:
    int largest1BorderedSquare(vector<vector<int>>& grid) {
        int n = grid.size(), m = grid[0].size();
        int s[n + 1][m + 1]; memset(s, 0, sizeof(s));
        // s[0][0...m] 和 s[0...n][0] 中的元素均为0,为了方便边界前缀和的计算
        // s[i][j] 表示以grid[i-1][j-1]为右下端点的所有左上放元素的和
        for (int i = 1; i <= n; i ++ ) 
            for (int j = 1; j <= m; j ++ ) 
                s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + grid[i - 1][j - 1];

        for (int d = min(n, m) - 1; d >= 0 ; d -- ){
            for (int i = 1; i + d <= n; i ++ ) {
                for (int j = 1; j + d <= m; j ++ ) {
                    int up = s[i][j + d] - s[i - 1][j + d] - s[i][j - 1] + s[i - 1][j - 1];
                    int down = s[i + d][j + d] - s[i + d - 1][j + d] - s[i + d][j - 1] + s[i + d - 1][j - 1];
                    int left = s[i + d][j] - s[i + d][j - 1] - s[i - 1][j] + s[i - 1][j - 1];
                    int right = s[i + d][j + d] - s[i + d][j + d - 1] - s[i - 1][j + d] + s[i - 1][j + d - 1];
                    if (up + down + left + right == 4 * (d + 1)) return (d + 1) * (d + 1);
                }
            }
        } 
        return 0;
    }
};

复杂度分析

时间复杂度:\(O(nm*min(n, m))\),\(n\) 和 \(m\)分别为 \(grid\) 二维数组行和列的长度;
空间复杂度:\(O(nm)\)。

标签:1139,right,边界,int,复杂度,down,正方形,grid
From: https://www.cnblogs.com/lxycoding/p/17297474.html

相关文章

  • [HAOI2007]理想的正方形【题解】
    题目描述有一个\(a\timesb\)的整数组成的矩阵,现请你从中找出一个\(n\timesn\)的正方形区域,使得该区域所有数中的最大值和最小值的差最小。输入格式第一行为\(3\)个整数,分别表示\(a,b,n\)的值。第二行至第\(a+1\)行每行为\(b\)个非负整数,表示矩阵中相应位置上......
  • 24.基准(基准面、基准轴、坐标系、点、质心、边界框、配合参考---适合批量装配(相同方
    一.基准面1.可增加的基准面数,可多生成几个基准面2.面、线、角度生成基准面二.轴1.过点垂直于面生成轴2.圆柱面三.坐标系四,质心,点击质心自动生成产品质心 ......
  • 正方形长方形的个数 规律
    正方形长方形的个数查看提交统计提问总时间限制: 1000ms 内存限制: 256000kB描述设有一个n*m方格的棋盘(1≤m,n≤100)。求出该棋盘中包含多少个正方形、多少个长方形(不包括......
  • 13.边界凸台/基体(功能类似于放样、扫描)
    1.定义:通过边界工具可以得到高质量、准确的特征边界的效果1   边界的效果2   ......
  • 华为OD机试 构成的正方形数量
    ......
  • 暴力-正方形
    1#include<bits/stdc++.h>2usingnamespacestd;3longlongansz,ansc;4intmain()5{6longlongn,m,n1,m1;7cin>>n>>m;8n1=n;9......
  • 暴力枚举正方形、长方形
    #include<bits/stdc++.h>usingnamespacestd;longlongn,m,nn,mm,zfx,cfx;//n、m为长宽intmain(){cin>>n>>m;nn=n;mm=m;while(mm>=1&&nn>=1......
  • 前端有边界,但低代码没有
    “前端已死”的论调,每隔一段时间就会被翻出来重新讨论,除了先前人们担忧的低代码对前端开发者的影响,还有最近爆火的chatGPT、GPT-4等。作为前端开发者,我非常不认可“前端已......
  • MySQL当中between的边界问题
    between边界:闭区间,notbetween边界:开区间日期边界问题,如:'2023-03-1012:00:00','2023-03-1312:00:00'如果用between '2023-03-10' and '2023-03-13' ,这样'2023-......
  • css设置正方形动态背景
    .wrapper{background:#50a3a2;background:-webkit-linear-gradient(topleft,#50a3a20%,#53e3a6100%);background:linear-gradient(tobottomrig......