美文网首页
LeetCode 542. 01 矩阵

LeetCode 542. 01 矩阵

作者: 大梦三千秋 | 来源:发表于2020-04-15 18:53 被阅读0次

542. 01 矩阵

题目来源:https://leetcode-cn.com/problems/01-matrix

题目


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

注意:

  • 给定矩阵的元素个数不超过 10000。
  • 给定矩阵中至少有一个元素是 0。
  • 矩阵中的元素只在四个方向上相邻: 上、下、左、右。

解题思路


思路:广度优先搜索

可以从 0 的位置开始进行广度优先搜索。

将 0 视为源点,将其都入队,各个 0 向 1 扩散(在这里每个 1 都是被离它最近的 0 扩散到的)。

扩散的时候要注意,在返回的矩阵中,可以在对应的坐标中设置距离值,同时标记是否访问过。需要注意的是其中 0 元素距离为 0,在构建返回矩阵时,设默认初始值为 0,这个时候,可以直接将源点 0 放入已标记部分。

具体看下面代码实现。

代码实现


class Solution:
    def updateMatrix(self, matrix: List[List[int]]) -> List[List[int]]:
        m, n = len(matrix), len(matrix[0])

        # 构建返回矩阵
        ans = [[0] * n for _ in range(m)]
        # 先找所有源点 0 的位置
        zero = [(i, j) for i in range(m) for j in range(n) if matrix[i][j] == 0]
        # 将所有源点 0 入队列
        from collections import deque
        queue = deque(zero)
        # 标记
        # 这里将源点 0 的位置加入标记
        # 是因为源点 0 的距离就是 0
        # 可不做变化,返回矩阵默认初始值为 0
        sign = set(queue)

        # 需扩散的四个方位
        directions = [(0, 1), (1, 0), (0, -1), (-1, 0)]

        while queue:
            # 出队列,进行扩散
            i, j = queue.popleft()
            for di, dj in directions:
                ni, nj = i + di, j + dj
                if 0<=ni<m and 0<=nj<n and (ni, nj) not in sign:
                    ans[ni][nj] = ans[i][j] + 1
                    queue.append((ni, nj))
                    sign.add((ni, nj))

        return ans

实现结果


实现结果

以上就是使用广度优先搜索的方法,找出源点 0 的位置进行扩散,进而解决《542. 01 矩阵》的主要内容,需要注意的是扩散的同时,需要标记哪部分已经扩散到的。


欢迎关注微信公众号《书所集录》

相关文章

  • LeetCode 542. 01 矩阵

    542. 01 矩阵 题目来源:https://leetcode-cn.com/problems/01-matri...

  • ARTS打卡第一周

    ARTS打卡第一周 Algorithm:每周至少做一个 leetcode 的算法题 542. 01 矩阵 Revi...

  • 542. 01 矩阵

    题目描述 给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离。 两个相邻元素间的距离为 1 。 ...

  • 542. 01矩阵

    题目描述 给定一个由0和1组成的矩阵,找出每个元素到最近0的距离,相邻元素间的距离为1。例如:输入 输出 注意: ...

  • 542. 01矩阵(Python)

    题目 难度:★★☆☆☆类型:数组方法:二分法 力扣链接请移步本题传送门[https://leetcode-cn.c...

  • LeetCode:01矩阵

    542. 01 矩阵 给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离。两个相邻元素间的距离为...

  • BFS / DFS 典型例题

    图的BFS: leetcode:1162 地图分析leetcode:542 01矩阵 树的BFS: 图的DFS: ...

  • LeetCode-01矩阵

    给定一个由0和1组成的矩阵,找出每个元素到最近的 0 的距离两个相邻元素间的距离为 1 。 快速浏览 超级原点 广...

  • leetcode-01矩阵

    这道题感觉很难理解,用了BFS方法。先是将位置为0的入队列,然后一圈圈扩展,位置为1的入队列。看下面链接详解。 利...

  • LeetCode-74-搜索二维矩阵

    LeetCode-74-搜索二维矩阵 74. 搜索二维矩阵[https://leetcode-cn.com/pro...

网友评论

      本文标题:LeetCode 542. 01 矩阵

      本文链接:https://www.haomeiwen.com/subject/uyjhvhtx.html