• 542. 矩阵


    给定一个由 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。
    矩阵中的元素只在四个方向上相邻: 上、下、左、右。

    方法一: 广度优先搜索(BFS)

    class Solution:
        '''
        BFS
        1. 每个作为超级源点(0 -> 1 -> 2 ...), 求每个点离0/1/2的最近值, 依次递增
        2. 记录起来(作为超级源点后, 上下左右被比较过的都记录起来) set()
        3. 队列append, pop
        4. dist = [[], [], []] 均赋值0
        '''
    
        def updateMatrix(self, mat: list) -> list:
            m, n = len(mat), len(mat[0])  # 矩阵
            dist = [[0] * n for _ in range(m)]  # 初始化
            record_list = set()
    
            # 取到所有的0坐标
            for i in range(m):
                for j in range(n):
                    if mat[i][j] == 0:
                        record_list.add((i, j))
    
            queue = collections.deque(record_list)  # 将所有0的坐标都添加到队列里面
            # 队列, 每次取完一个, 判断上下左右
            while queue:
                i, j = queue.popleft()
    
                for diretion in [[1, 0], [-1, 0], [0, 1], [0, -1]]:  # 每次只判断上下左右
                    new_i, new_j = diretion[0] + i, diretion[1] + j
    
                    if 0 <= new_i < m and 0 <= new_j < n:
                        if (new_i, new_j) not in record_list:
                            dist[new_i][new_j] = dist[i][j] + 1
                            queue.append((new_i, new_j))
                            record_list.add((new_i, new_j))
            return dist
  • 相关阅读:
    nodejs 核心模块crypto
    es6新特性学习
    nodejs 常用全局包
    ionic+angular+cordova 安卓环境搭建
    谷歌浏览器调试保存到文件
    Linux命令
    Linux中用户管理详解(上)-Linux学习日记
    liunx下忘记root密码的解决方法
    cvCanny的参数
    VC运行时库(/MD、/MT等)
  • 原文地址:https://www.cnblogs.com/yunxintryyoubest/p/14861126.html
Copyright © 2020-2023  润新知