Leetcode刷题(17)队列的应用:01矩阵(寻找最短路径问题,BFS应用,动态规划最优解法)

题目

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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值