【leetcode】542. 01 矩阵

给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离。

两个相邻元素间的距离为 1 。

示例 2: 
输入:

0 0 0
0 1 0
1 1 1

输出:

0 0 0
0 1 0
1 2 1

思路:广度优先遍历bfs,一般题目的字眼是“最短的步数”、“最小的距离”

深搜dfs是“某一解”

  1. 首先找到给定节点,判断它是否为0,这个初始节点当作第0层,此时distance为0。
  2. 找到初始节点周围四个坐标,这四个节点当作第一层,此时distance为1,判断它们是否为0。
  3. 再找到这四个节点周围八个节点,这八个节点当作第二层。
  4. 重复以往,层层递进。

网易面试的一道题。

偶的?,模板只要记住一种就好了,队列添加的是==0的元素。

class Solution:
    def updateMatrix(self, matrix):
        res = []
        if not matrix or not matrix[0]:return res
        m, n = len(matrix), len(matrix[0])
        queue = []
        visited = set()
        # 初始化队列,将所有起始点都加入
        for i in range(m):
            for j in range(n):
                if matrix[i][j]==0:
                    queue.append((i,j))
                    visited.add((i,j))
        while queue:
            a,b = queue.pop(0)
            dx = [-1,0,1,0]
            dy = [0,1,0,-1]
            for i in range(4):
                x = a+dx[i]
                y = b+dy[i]
                # 如果没有撞墙,就添加
                if x>=0 and x<m and y>=0 and y<n and (x,y) not in visited:
                    queue.append((x,y))
                    visited.add((x,y))
                    matrix[x][y] = matrix[a][b]+1 # 注意这里是修改了原数组
        return matrix

别人的: 

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值