📅  最后修改于: 2023-12-03 15:21:40.909000             🧑  作者: Mango
给定一个由 0 和 1 组成的二维矩阵,在这个矩阵中,0 表示空单元,1 表示障碍物。每个单元格都有一个距离,表示它和最近的 1 的距离。两个相邻单元格的距离为 1。对于每个空单元格,返回距离它最近的 1 的距离。如果无法到达任何 1,则返回 -1。
这道题我们可以运用广度优先搜索算法(BFS)来解题。首先我们把所有的 1 放入到一个队列中,从这些 1 开始,依次往四周扩展,将距离为 1 的所有 0 入队,并且把这些 0 的距离设置为 1。接下来,从队列中弹出这个 0,继续往四周扩展,距离为 2 的 0 入队,并把这些 0 的距离设置为 2,以此类推。
最后,队列中存储的就是所有的 0,它们到 1 的最短距离。我们只需要遍历整个矩阵,计算出每个 0 到队列中的距离最小值,就能得到这个 0 到最近的 1 的距离。
class Solution:
def updateMatrix(self, matrix: List[List[int]]) -> List[List[int]]:
queue = []
visited = set()
m, n = len(matrix), len(matrix[0])
# 计算所有的 1,并把它们放到队列中
for i in range(m):
for j in range(n):
if matrix[i][j] == 1:
queue.append((i, j))
visited.add((i, j))
# 记录四个方向的偏移量
dirs = [(0, 1), (0, -1), (1, 0), (-1, 0)]
# 队列为空,表示所有的 0 都已经计算出距离
while queue:
x, y = queue.pop(0)
# 向四周扩展
for dx, dy in dirs:
nx, ny = x + dx, y + dy
if 0 <= nx < m and 0 <= ny < n and (nx, ny) not in visited:
matrix[nx][ny] = matrix[x][y] + 1
visited.add((nx, ny))
queue.append((nx, ny))
return matrix
以上就是使用 BFS 解决这道题的代码,时间复杂度为 O(mn),其中 m 和 n 分别是矩阵的行数和列数。