542. 01 矩阵

每日leetcode(29)

  1. 01 矩阵,今天的题目如下

给定一个由 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

我的想法是这样的,对每个元素进行上下左右元素的递归,如果都为0,该位置为1,若不都为0,则找出上下左右递归的最小值,但是别想了,这个一听就超时了,优化最多也就在上下左右递归时候,加个判断是否visited,若visited,则直接使用该位置的值,没有visited,则递归,同时该位置visited。
这时候就要引入今天的主角了,BFS,广度遍历,之前我所理解的广度遍历只有一个起点,这道题的解法是每个0都作为起点,先找出所有的0值的位置添加到一个列表,当列表不为空,取出一个坐标值,如果没被访问过,而且遍历上下左右的坐标值,更新为当前坐标对应值+1,将四周坐标添加进列表,并添加访问标志,实现了一个栈,相当于从0开始,向外拓展,每次+1。以下是评论区大神的代码

class Solution:
    def updateMatrix(self, matrix: List[List[int]]) -> 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

不过这个方法的效率算不上很高,只有百分之70多,之后在研究看看别的算法
还看到评论区有个使用两次遍历的算法,第一次更新坐上,第二次更新右下,之后贴代码,不过这个效率也不是特别高,还不如这里说的算法,我就好奇了,还有什么算法这么快的吗

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值