• 542. 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

    思路:

    题目给出了多个1,要找出每个1到0的最近曼哈顿距离。由于1到0的距离和0到1的距离一样的,所以其实我们可以换个思维:找出每个0到1的距离。因此,题目可以抽象成:多个起始点的BFS

    class Solution:
        def updateMatrix(self, matrix: List[List[int]]) -> List[List[int]]:
            M, N = len(matrix), len(matrix[0])
            queue = collections.deque()
            visited = [[0] * N for _ in range(M)]
            res = [[0] * N for _ in range(M)]
            for i in range(M):
                for j in range(N):
                    if matrix[i][j] == 0:
                        queue.append((i, j))
                        visited[i][j] = 1
            dirs = [(0, 1), (0, -1), (1, 0), (-1, 0)]
            step = 0
            while queue:
                size = len(queue)
                for i in range(size):
                    x, y = queue.popleft()
                    if matrix[x][y] == 1:
                        res[x][y] = step
                    for dx, dy in dirs:
                        newx, newy = x + dx, y + dy
                        if newx < 0 or newx >= M or newy < 0 or newy >= N or visited[newx][newy] == 1:
                            continue
                        queue.append((newx, newy))
                        visited[newx][newy] = 1
                step += 1
            return res

    拓展一:BFS使用队列,把每个还没有搜索到的点依次放入队列,然后再弹出队列的头部元素当做当前遍历点。BFS总共有两个模板:

    1.如果不需要确定当前遍历到了哪一层,BFS模板如下。

    while queue 不空:
        cur = queue.pop()
        for 节点 in cur的所有相邻节点:
            if 该节点有效且未访问过:
                queue.push(该节点)
    

    2.如果要确定当前遍历到了哪一层,BFS模板如下。

    这里增加了level表示当前遍历到二叉树中的哪一层了,也可以理解为在一个图中,现在已经走了多少步了。size表示在当前遍历层有多少个元素,也就是队列中的元素数,我们把这些元素一次性遍历完,即把当前层的所有元素都向外走了一步。

    level = 0
    while queue 不空:
        size = queue.size()
        while (size --) {
            cur = queue.pop()
            for 节点 in cur的所有相邻节点:
                if 该节点有效且未被访问过:
                    queue.push(该节点)
        }
        level ++;
    

    拓展二:python数据结构之栈、队列的实现

    1.关于栈

    >>> stack = [3, 4, 5]
    >>> stack.append(6)
    >>> stack.append(7)
    >>> stack
    [3, 4, 5, 6, 7]
    >>> stack.pop()
    7
    >>> stack
    [3, 4, 5, 6]
    >>> stack.pop(0)
    3
    >>> stack
    [4, 5,6]
    

    2.关于队列

    >>> from collections import deque
    >>> queue = deque(["Eric", "John", "Michael"])
    >>> queue.append("Terry")          
    >>> queue.append("Graham")      
    >>> queue.popleft()      
    'Eric'
    >>> queue.pop() 
    'Graham'
    >>> queue    
    deque(['John','Michael', 'Terry'])
    

      

    参考文献:

    https://leetcode-cn.com/problems/01-matrix/solution/tao-lu-da-jie-mi-gao-dong-ti-mu-kao-cha-shi-yao-2/

    https://www.cnblogs.com/yupeng/p/3413852.html


  • 相关阅读:
    Python连接MySQL乱码(中文变问号)
    mysql学习04 pymysql 学习
    mysql学习03
    多态与多态性
    重用父类功能的两种方式
    菱形继承问题
    组合
    继承的应用和派生的概念引出
    类的继承
    类与类型
  • 原文地址:https://www.cnblogs.com/USTC-ZCC/p/12708345.html
Copyright © 2020-2023  润新知