542.01矩阵

https://leetcode-cn.com/problems/01-matrix/

一、bfs

乍看以为是dp,后来发现要从0出发而不是直接顺序遍历矩阵

先遍历矩阵找到所有0,然后以所有0为起点bfs,0到0的距离为0,到周围第一层的距离为1,到第n层的距离为第n-1层+1,依次类推

是否会冲突?因为求最短距离,因此遵循“先到先得”原则,设置vistied矩阵标志是否访问,某个位置第二次被访问,说明已经有更近的0,跳过即可

import queue
class Solution:
    def updateMatrix(self, mat) :
        m, n = len(mat), len(mat[0])
        dist = [[0] * n for _ in range(m)]
        q = queue.Queue()
        visited = [[False] * n for _ in range(m)]
        for i in range(m):
            for j in range(n):
                if mat[i][j] == 0:
                    q.put((i, j))
                    visited[i][j] = True
        while not q.empty():
            i, j = q.get()
            # 遍历(i,j)的上下左右,如果没访问过就设置距离,并设访问标记,入队
            for ni, nj in [(i - 1, j), (i + 1, j), (i, j - 1), (i, j + 1)]:
                if ni >=0 and ni < m and nj >= 0 and nj < n and not visited[ni][nj]:
                    dist[ni][nj] = dist[i][j] + 1
                    visited[ni][nj] = True
                    q.put((ni, nj))
        return dist

最后更新于