20190712-01矩阵的解题思考

2019-07-24 09:21:05来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

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

注意:

 

给定矩阵的元素个数不超过 10000。

给定矩阵中至少有一个元素是 0。

矩阵中的元素只在四个方向上相邻: 上、下、左、右。

题目转载于Leetcode。

算法

  1. 记录Q =矩阵所有的值为0的节点
  2. 将值为0的节点看作已处理过的节点,记录visited = set(Q)
  3. 当Q不为空的时候依次从Q的左边取节点对取到的节点做以下判断:

a)   节点的上下左右领结点是否合法存在(即是否越界)

b)   如果上下左右节点存在,判断其是否已被更新

c)   如果即存在又没有被更新,则更新其节点值为当前取到的节点值+1,即任何0节点上下左右的领结点到0的距离为1,更新后将更新后的节点加入Q和Visted里面。加入Q里面是为了一层一层的更新远端节点的距离,加入Visited是为了以防后续被更新

代码

def updateMatrix(matrix):
    matrix_length = len(matrix)
    if matrix_length < 1:
        return matrix
    row_length = len(matrix[0])
    queue = []
    visited = set()
    for i in range(matrix_length):
        for j in range(row_length):
            if matrix[i][j] == 0:
                queue.append((i, j))#找到所有的0结点
                visited.add((i, j))#将0节点看作已经被更新的节点visited
    while queue:
        i, j = queue.pop(0)
        for x, y in [(i + 1, j), (i - 1, j), (i, j + 1), (i, j - 1)]:  # 下上右左4个节点,0的上下左右到0的距离都为1
            if 0 <= x < matrix_length and 0 <= y < row_length and (x, y) not in visited:  # x,y范围区间在矩阵边界值以内,且未被更新
                matrix[x][y] = matrix[i][j] + 1
                visited.add((x, y))
                queue.append((x, y))
    return matrix

 


原文链接:https://www.cnblogs.com/hyj691001/p/11178301.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:Python连载22-调试&amp;单元测试

下一篇:python小游戏贪吃蛇源码下载