[LeetCode in Python] 542 (M) 01 matrix 01 矩阵
题目
https://leetcode-cn.com/problems/01-matrix/
解题思路
- 先将全部0的位置都放入队列,同时将其都加入
seen_set
- 标准BFS流程:
- 首元素a出队,即为坐标
- 探测a上下左右四个方向的元素
- 如果坐标非法,或者曾经访问过,则跳过
- 更新元素对应的距离值=a的距离+1
- 更新
seen_set
- 将元素入队
代码
class Solution:
def updateMatrix(self, matrix: List[List[int]]) -> List[List[int]]:
n_row = len(matrix)
n_col = len(matrix[0])
# - init distance matrix
dist = [[0]*n_col for _ in range(n_row)]
# - save visited cell here
seen_set = set()
# - put all 0 cells in queue
q = []
for row in range(n_row):
for col in range(n_col):
if matrix[row][col] == 0:
q.append((row,col))
seen_set.add((row,col))
# - BFS
while q:
row,col = q.pop(0)
# - 4 directions: left,right,top,bottom
for dr,dc in [
(-1,0), (1,0), (0,-1), (0,1)
]:
# - next pos
nr, nc = row + dr, col + dc
# - check if pos is valid
if nr < 0: continue
if nr >= n_row: continue
if nc < 0: continue
if nc >= n_col: continue
if (nr,nc) in seen_set: continue
# - update dist
dist[nr][nc] = dist[row][col] + 1
seen_set.add((nr,nc))
q.append((nr,nc))
return dist
爱生活,爱拉风