其他分享
首页 > 其他分享> > 【动态规划】力扣542:01矩阵

【动态规划】力扣542:01矩阵

作者:互联网

给定一个由 0 和 1 组成的矩阵 mat ,请输出一个大小相同的矩阵,其中每一个格子是 mat 中对应位置元素到最近的 0 的距离。
两个相邻元素间的距离为 1 。
示例:

image
输入:mat = [[0,0,0],[0,1,0],[0,0,0]]
输出:[[0,0,0],[0,1,0],[0,0,0]]

一般来说,因为这道题涉及到四个方向上的最近搜索,所以很多人的第一反应可能会是广度优先搜索。但是对于一个大小 O(mn) 的二维数组,对每个位置进行四向搜索,最坏情况的时间复杂度(即全是 1)会达到恐怖的 O(m2n2)。可以使用一个 dp 数组做 memoization,使得广度优先搜索不会重复遍历相同位置.
另一种更简单的方法是,先从左上到右下进行一次动态搜索,即完成左、上两个方向的查找;再从右下到左上进行一次动态搜索,即完成右、下两个方向的查找。两次动态搜索即可完成四个方向上的查找。

class Solution:
    def updateMatrix(self, matrix: List[List[int]]) -> List[List[int]]:
        if not matrix:
            return 0
        m, n = len(matrix), len(matrix[0])
        dp = [[10**4] * n for _ in range(m)]
        # 第一次查找
        for i in range(m):
            for j in range(n):
                if matrix[i][j] == 0:
                    dp[i][j] = 0
                if i > 0:
                    dp[i][j] = min(dp[i][j], dp[i - 1][j] + 1)
                if j > 0:
                    dp[i][j] = min(dp[i][j], dp[i][j - 1] + 1)
        # 第二次查找
        for i in range(m - 1, -1, -1):
            for j in range(n - 1, -1, -1):
                if i < m - 1:
                    dp[i][j] = min(dp[i][j], dp[i + 1][j] + 1)
                if j < n - 1:
                    dp[i][j] = min(dp[i][j], dp[i][j + 1] + 1)
        return dp

时间复杂度:O(mn),其中 m 为矩阵行数,n 为矩阵列数。计算 dp 数组的过程中需要遍历两次矩阵,因此时间复杂度为 O(2mn)=O(mn)。
空间复杂度:O(1),只计算额外的空间复杂度。除了答案数组以外,只需要常数空间存放若干变量。

标签:力扣,01,matrix,min,复杂度,矩阵,542,range,dp
来源: https://www.cnblogs.com/Jojo-L/p/16172115.html