本题解采用广度优先搜索(BFS)来找出矩阵中每个元素到最近的0的距离。首先,将所有值为0的元素的位置加入到队列中,并初始化它们的距离为0。对于矩阵中的1,距离初始化为-1表示未访问。队列中的元素依次出队,对其四个方向的邻居进行检查。如果邻居未被访问过(即距离为-1),则更新其距离为当前元素的距离加1,并将其加入队列中继续处理。这一过程重复进行,直到队列为空。
时间复杂度: O(m*n)
空间复杂度: O(m*n)
class Solution:
def updateMatrix(self, mat):
m = len(mat)
n = len(mat[0])
res = [[-1]*n for _ in range(m)] # 结果矩阵初始化为-1
travel = [[False]*n for _ in range(m)] # 访问记录矩阵
stack = []
for i in range(m):
for j in range(n):
if mat[i][j]==0:
res[i][j] = 0 # 初始化0的位置距离为0
travel[i][j] = True # 标记为已访问
stack.append((i,j)) # 将0的位置加入队列
stage = 0
while stack:
tmp = []
for i,j in stack:
res[i][j] = stage # 更新距离
# 检查四个方向的邻居
if i>0 and travel[i-1][j]==False:
tmp.append((i-1,j))
travel[i-1][j] = True
if i<m-1 and travel[i+1][j]==False:
tmp.append((i+1,j))
travel[i+1][j] = True
if j>0 and travel[i][j-1]==False:
tmp.append((i,j-1))
travel[i][j-1] = True
if j<n-1 and travel[i][j+1]==False:
tmp.append((i,j+1))
travel[i][j+1] = True
stage+=1 # 增加BFS的层次
stack = tmp # 更新队列
return res