题目
542. 01矩阵


难度:中等(很高兴,现在leetcode关于栈和队列的中等题,我拿到手,都有思路了,也能做出来,博客没有白总结~)
题目分析:从非零的数往四周探索,找到的第一个零,记录下此时的步数,如果是使用广度优先搜索(BFS), 那找到的这个,便是最近的距离;不过缺点也很明显,每一次到一个新的非零的位置,都要重复进行一样的工作,而且麻烦的是,之前的结果,不能被有效利用。下面是我基于朴素的BFS写出来的答案,没有超时,不过对比其他人的答案,发现十分笨拙。
1. 解法一:朴素的BFS解法,优化空间极大
class Solution:
def updateMatrix(self, matrix: List[List[int]]) -> List[List[int]]:
# 由于求的是最短的距离,最合适的解法是BFS
# 写一个两层for循环,每一个元素都要遍历
# 每一个元素建一个队列,队列里面藏的是下一步的方向
from collections import deque # 使用队列
row = len(matrix)
if row == 0:
return matrix
col = len(matrix[0])
# 建立答案矩阵, 答案直接存入就好
# ans = [[0]*col for i in range(row)]
dirs = [(0, 1), (1, 0), (0, -1), (-1, 0)] # 顺序是右下左上
for i in range(row):
for j in range(col):
if matrix[i][j] == 0:
continue
my_que = deque()
step = 0
# 第一个元素入队
my_que.append((i, j)) # ((r,c), dirs)
while my_que: # 队列不空
step += 1
size = len(my_que)
for _ in range(size): # 在这里面都是同一步的
pos

807

被折叠的 条评论
为什么被折叠?



