1139. Largest 1-Bordered Square

30 篇文章 0 订阅

Given a 2D grid of 0s and 1s, return the number of elements in the largest square subgrid that has all 1s on its border, or 0 if such a subgrid doesn't exist in the grid.

 

Example 1:

Input: grid = [[1,1,1],[1,0,1],[1,1,1]]
Output: 9

Example 2:

Input: grid = [[1,1,0,0]]
Output: 1

 

Constraints:

  • 1 <= grid.length <= 100
  • 1 <= grid[0].length <= 100
  • grid[i][j] is 0 or 1

思路:brute force的解法很简单,直接从大到小遍历所有可能的结果,但是复杂度到了10^8,会TLE

一个优化的思路是:预先计算出matrix的每个(i,j)位置求出能往4个方向扩展的最大长度(taolu),复杂度10^6

class Solution(object):
    def largest1BorderedSquare(self, grid):
        """
        :type grid: List[List[int]]
        :rtype: int
        """
        n,m=len(grid),len(grid[0])
        
        # up
        expand_up = [[0 for _ in range(m)] for _ in range(n)]
        expand_up[0] = grid[0]
        for i in range(1,n):
            for j in range(m):
                if grid[i][j]==0: continue
                expand_up[i][j] = expand_up[i-1][j]+1
        
        #down
        expand_down = [[0 for _ in range(m)] for _ in range(n)]
        expand_down[n-1] = grid[n-1]
        for i in range(n-2,-1,-1):
            for j in range(m):
                if grid[i][j]==0: continue
                expand_down[i][j] = expand_down[i+1][j]+1
        
        # left
        expand_left = [[0 for _ in range(m)] for _ in range(n)]
        for i in range(n): expand_left[i][0] = grid[i][0]
        for i in range(n):
            for j in range(1,m):
                if grid[i][j]==0: continue
                expand_left[i][j] = expand_left[i][j-1]+1
        
        # right
        expand_right = [[0 for _ in range(m)] for _ in range(n)]
        for i in range(n): expand_right[i][m-1] = grid[i][m-1]
        for i in range(n):
            for j in range(m-2,-1,-1):
                if grid[i][j]==0: continue
                expand_right[i][j] = expand_right[i][j+1]+1
        
        
        
        def ok(x):
            for i in range(0,n-x+1):
                for j in range(0,m-x+1):
                    expand_ul=min([expand_right[i][j], expand_down[i][j]])
                    expand_ur=min([expand_left[i][j+x-1],expand_down[i][j+x-1]])
                    expand_bl=min([expand_right[i+x-1][j],expand_up[i+x-1][j]])
                    expand_br=min([expand_left[i+x-1][j+x-1],expand_up[i+x-1][j+x-1]])
                    
                    if min([expand_ul,expand_ur,expand_bl,expand_br])>=x:
                        return True
            return False
        
        for i in range(min(n,m),0,-1):
            if ok(i): return i*i
        return 0
    
    
    

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值