该题解采用了广度优先搜索(BFS)的方法。首先,遍历整个矩阵,将所有为0的位置坐标存储到一个列表中,这些位置作为BFS的起始节点。使用一个队列来执行BFS,队列的初始内容是所有0的位置。在BFS过程中,从队列中取出位置,并将其四周的相邻位置(上、下、左、右)加入队列中,同时记录从起始节点到当前节点的距离。通过这种方式,可以确保每个元素到最近的0的距离被正确计算并存储在结果矩阵中。
时间复杂度: O(m * n)
空间复杂度: O(m * n)
class Solution:
def updateMatrix(self, mat: List[List[int]]) -> List[List[int]]:
m = len(mat)
n = len(mat[0])
ans = [[0 for j in range(n)] for i in range(m)]
start = []
for i in range(m):
for j in range(n):
if mat[i][j] == 0:
start.append((i, j))
def bfs(roots):
visted = set()
for root in roots:
visted.add(root)
to_search = roots
level = -1
while to_search:
tmp = []
level += 1
for root in to_search:
x, y = root[0], root[1]
if mat[x][y] == 1:
ans[x][y] = level
if x - 1 >= 0 and (x-1, y) not in visted:
visted.add((x-1, y))
tmp.append((x-1, y))
if x + 1 < m and (x+1, y) not in visted:
visted.add((x+1, y))
tmp.append((x+1, y))
if y - 1 >= 0 and (x, y-1) not in visted:
visted.add((x, y-1))
tmp.append((x, y-1))
if y + 1 < n and (x, y+1) not in visted:
visted.add((x, y+1))
tmp.append((x, y+1))
to_search = tmp
bfs(start)
return ans