【动态规划】力扣542:01矩阵
作者:互联网
给定一个由 0 和 1 组成的矩阵 mat ,请输出一个大小相同的矩阵,其中每一个格子是 mat 中对应位置元素到最近的 0 的距离。
两个相邻元素间的距离为 1 。
示例:
输入: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