给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离。
两个相邻元素间的距离为 1 。
示例 2:
输入:
0 0 0
0 1 0
1 1 1
输出:
0 0 0
0 1 0
1 2 1
思路:广度优先遍历bfs,一般题目的字眼是“最短的步数”、“最小的距离”。
深搜dfs是“某一解”。
- 首先找到给定节点,判断它是否为0,这个初始节点当作第0层,此时distance为0。
- 找到初始节点周围四个坐标,这四个节点当作第一层,此时distance为1,判断它们是否为0。
- 再找到这四个节点周围八个节点,这八个节点当作第二层。
- 重复以往,层层递进。
网易面试的一道题。
偶的?,模板只要记住一种就好了,队列添加的是==0的元素。
class Solution:
def updateMatrix(self, matrix):
res = []
if not matrix or not matrix[0]:return res
m, n = len(matrix), len(matrix[0])
queue = []
visited = set()
# 初始化队列,将所有起始点都加入
for i in range(m):
for j in range(n):
if matrix[i][j]==0:
queue.append((i,j))
visited.add((i,j))
while queue:
a,b = queue.pop(0)
dx = [-1,0,1,0]
dy = [0,1,0,-1]
for i in range(4):
x = a+dx[i]
y = b+dy[i]
# 如果没有撞墙,就添加
if x>=0 and x<m and y>=0 and y<n and (x,y) not in visited:
queue.append((x,y))
visited.add((x,y))
matrix[x][y] = matrix[a][b]+1 # 注意这里是修改了原数组
return matrix
别人的:
class Solution:
def updateMatrix(self, matrix):
"""
:type matrix: List[List[int]]
:rtype: List[List[int]]
"""
m, n = len(matrix), len(matrix[0])
Q = collections.deque([])
visited = set()
# 初始化队列,将所有起始点加入
for i in range(m):
for j in range(n):
if matrix[i][j] == 0:
Q.append((i, j))
visited.add((i, j))
# 将所有相邻节点加入队列
while Q:
i, j = Q.popleft()
for x, y in [(i+1, j), (i-1, j), (i, j+1), (i, j-1)]:
if 0 <= x < m and 0 <= y < n and (x, y) not in visited:
matrix[x][y] = matrix[i][j] + 1
visited.add((x, y))
Q.append((x, y))
return matrix