题目来源:https://leetcode-cn.com/problems/01-matrixpython
给定一个由 0 和 1 组成的矩阵,找出每一个元素到最近的 0 的距离。web
两个相邻元素间的距离为 1 。bash
示例 1:微信
输入:app
0 0 0 0 1 0 0 0 0
输出:svg
0 0 0 0 1 0 0 0 0
示例 2:ui
输入:spa
0 0 0 0 1 0 1 1 1
输出:code
0 0 0 0 1 0 1 2 1
注意:xml
思路:广度优先搜索
能够从 0 的位置开始进行广度优先搜索。
将 0 视为源点,将其都入队,各个 0 向 1 扩散(在这里每一个 1 都是被离它最近的 0 扩散到的)。
扩散的时候要注意,在返回的矩阵中,能够在对应的坐标中设置距离值,同时标记是否访问过。须要注意的是其中 0 元素距离为 0,在构建返回矩阵时,设默认初始值为 0,这个时候,能够直接将源点 0 放入已标记部分。
具体看下面代码实现。
class Solution: def updateMatrix(self, matrix: List[List[int]]) -> List[List[int]]: m, n = len(matrix), len(matrix[0]) # 构建返回矩阵 ans = [[0] * n for _ in range(m)] # 先找全部源点 0 的位置 zero = [(i, j) for i in range(m) for j in range(n) if matrix[i][j] == 0] # 将全部源点 0 入队列 from collections import deque queue = deque(zero) # 标记 # 这里将源点 0 的位置加入标记 # 是由于源点 0 的距离就是 0 # 可不作变化,返回矩阵默认初始值为 0 sign = set(queue) # 需扩散的四个方位 directions = [(0, 1), (1, 0), (0, -1), (-1, 0)] while queue: # 出队列,进行扩散 i, j = queue.popleft() for di, dj in directions: ni, nj = i + di, j + dj if 0<=ni<m and 0<=nj<n and (ni, nj) not in sign: ans[ni][nj] = ans[i][j] + 1 queue.append((ni, nj)) sign.add((ni, nj)) return ans
以上就是使用广度优先搜索的方法,找出源点 0 的位置进行扩散,进而解决《542. 01 矩阵》的主要内容,须要注意的是扩散的同时,须要标记哪部分已经扩散到的。
欢迎关注微信公众号《书所集录》