day04 542. 01 矩阵[中等]

1.题目描述  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
注意:

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

 

2.思路分析

2.1 一开始就想到了几度空间,从0开始外围扩散遍历的思路,不过后来想的还是麻烦,考虑看看动态规划能不能行。当前为0,则为0,当前为1,则等于min(周围距离)+1,这明显是个相互依赖的问题,不是动态规划下一步依赖上一步,而不是相互依赖的这种递推公式。当然,几度空间的思路也可以理解为 dp[i, j] = 某一个已知邻居dp + 1

2.2 另一个简单粗暴思路就是获取所有的0点,若当前为1,则计算其到所有为0的的曼哈顿距离,最小值即为所求。

 

3.debug过程

3.1 没加坐标范围的阈值约束,后来发现又约束错了,应该是 <m 而不是<=

3.2 后来发现没有return 值,低级错误

3.3 没有注意获取的邻居中可能有不需要下一次赋值的点,下一次赋值的时候要刨除掉

 

4.运行结果

执行用时 :712 ms, 在所有 Python 提交中击败了57.94%的用户

内存消耗 :17.7 MB, 在所有 Python 提交中击败了100.00%的用户

 

5.ac代码(python):

class Solution(object):
    def updateMatrix(self, matrix):
        """
        :type matrix: List[List[int]]
        :rtype: List[List[int]]
        1.思路1
        几度空间的思路,先将为0的标记,同时记录当前被标记点的未标记邻居,要注意去重
        下一轮中遍历上一轮的邻居,直到不再有未标记邻居为止
        """
        dis_matrix = []
        nabers = set()
        m = len(matrix)
        n = len(matrix[0])
        for i in range(len(matrix)):
            row = []
            for j in range(len(matrix[0])):
                row.append(-1)
                if matrix[i][j] == 0:
                    nabers.add((i, j))
            dis_matrix.append(row)
        cur_dis = 0
        while len(nabers) > 0:
            new_nabers = set()
            for naber in nabers:
                i = naber[0]
                j = naber[1]
                if dis_matrix[i][j] != -1:
                    continue
                dis_matrix[i][j] = cur_dis
                for point in [(-1, 0), (1, 0), (0, -1), (0, 1)]:
                    p = i + point[0]
                    k = j + point[1]
                    if 0<= p < m and 0<= k < n and dis_matrix[p][k] == -1:
                       new_nabers.add((p, k))
            cur_dis += 1
            nabers = new_nabers
        return dis_matrix

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值