Leetcode 1139:最大的以 1 为边界的正方形(超详细的解法!!!)

这篇博客介绍了如何解决Leetcode 1139题,即找到由1构成的最大正方形子网格。文章提供了两种解决方案,一种是暴力解法,时间复杂度为O(n^4),另一种是优化后的算法,时间复杂度为O(n^2)。博主分享了思路,并给出了相关链接和代码实现。
摘要由CSDN通过智能技术生成

给你一个由若干 01 组成的二维网格 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]01

解题思路

首先我们不难想到暴力法,假设给定的grid长为c,高为r,我们从大到小遍历区间[0,min(r,c)]内的值k,我们以这个k作为正方形的宽度,然后遍历grid的每个点,分别以它作为正方形的左上角点。我们检查这个边长为k的正方形是不是合法,如果合法,那么此时就是最大的正方形,返回k**2即可。

class Solution:
    def largest1BorderedSquare(self, grid: List[List[int]]) -> int:
        r, c = len(grid), len(grid[0])
        def check(x1, y1, x2, y2):
            for x in range(x1, x2):
                if grid[x][y1] != 1 or grid[x][y2-1] != 1:
                    return False
            for y in range(y1, y2):
                if grid[x1][y] != 1 or grid[x2-1][y
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值