给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离。
两个相邻元素间的距离为 1 。
示例 1:
输入:
0 0 0
0 1 0
0 0 0
输出:
0 0 0
0 1 0
0 0 0
示例 2:
输入:
0 0 0
0 1 0
1 1 1
输出:
0 0 0
0 1 0
1 2 1
注意:
给定矩阵的元素个数不超过 10000。
给定矩阵中至少有一个元素是 0。
矩阵中的元素只在四个方向上相邻: 上、下、左、右。
题解
广度优先搜索。广度优先搜索需要一个辅助的队列,每次将搜索过的点append到队列最后,然后弹出队列最前面的坐标进行搜索。本题还需要求距离,所以需要在队列的坐标中添加距离。
class Solution(object):
def updateMatrix(self, matrix):
# import collections
# 广度优先算法
# 使用一个辅助的队列,当队列不为空时可以一直进行广度搜索
# 这种需要计算距离的需要将距离添加到队列的坐标后面,每使用一次这个坐标,距离增加1
row = len(matrix)
col = len(matrix[0])
grids = [[0, -1],
[0, 1],
[-1, 0],
[1, 0]]
def bfs(visited, queue):
while queue:
x, y, length = queue.pop(0)
for grid in grids:
new_x, new_y = x + grid[0], y + grid[1]
if -1<new_x<row and -1<new_y<col and [new_x, new_y] not in visited:
if matrix[new_x][new_y]==0:
return length+1
visited.append([new_x, new_y])
queue.append([new_x, new_y, length + 1])
for i in range(row):
for j in range(col):
if matrix[i][j]!=0:
visited = [[i, j]]
queue = [[i, j, 0]]
dist = bfs(visited, queue)
matrix[i][j] = dist
return matrix