leetcode 542. 01 矩阵 python

题目描述:

 题解(BFS):

题解一:

1.创建一个队列myq,初始化为空,创建一个和mat结构相同的newmat作为返回值,初始化为一个很大的值,之后进行更新。另一个和mat结构相同的visited记录当前位置是否已经被处理,初始化为全0,表示未被处理。

2.将mat中值为0的位置(i,j)对应的newmat值设为0,visited设为1,表示已经处理过,然后将(i,j)加入队列myq。

3.取出myq中第一个节点(posx,posy),对该位置上下左右四个相邻位置的newmat进行更新,并将该位置标记为处理过,然后加入队列。

4.重复3直到队列为空。

class Solution(object):
    def updateMatrix(self, mat):
        direction = [(0,1),(0,-1),(1,0),(-1,0)]
        myq = deque()
        row = len(mat)
        col = len(mat[0])
        newmat = [[row*col for j in range(col)] for i in range(row)]
        visited = [[0 for j in range(col)] for i in range(row)]
        for i in range(row):
            for j in range(col):
                if mat[i][j]==0:
                    newmat[i][j] = 0
                    visited[i][j] = 1
                    myq.append((i,j))

        while myq:
            posx,posy = myq.popleft()
            for dx,dy in direction:
                nx = posx+dx
                ny = posy+dy
                if 0<=nx<row and 0<=ny<col and visited[nx][ny]==0:
                    newmat[nx][ny] = 1+newmat[posx][posy]
                    visited[nx][ny] = 1
                    myq.append((nx,ny))
        return newmat

题解二:
题解一改进版,不需要visited的额外空间。
class Solution(object):
    def updateMatrix(self, mat):
        direction = [(0,1),(0,-1),(1,0),(-1,0)]
        newmat = [[len(mat)*len(mat[0]) for i in range(len(mat[0]))] for j in range(len(mat))]
        myq = deque()
        for i in range(len(mat)):
            for j in range(len(mat[0])):
                if mat[i][j]==0:
                    newmat[i][j] = 0
                    myq.append((i,j))
        while myq:
            posx,posy = myq.popleft()
            for dx,dy in direction:
                nx = posx+dx
                ny = posy+dy
                if 0<=nx<len(mat) and 0<=ny<len(mat[0]) and mat[nx][ny]==1:
                    if newmat[nx][ny]>newmat[posx][posy]+1:
                        myq.append((nx,ny))
                        newmat[nx][ny] = newmat[posx][posy]+1
        return newmat

 

 

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值