給定乙個由 0 和 1 組成的矩陣 mat ,請輸出乙個大小相同的矩陣,其中每乙個格仔是 mat 中對應位置元素到最近的 0 的距離。
兩個相鄰元素間的距離為 1 。
示例:
一般來說,因為這道題涉及到四個方向上的最近搜尋,所以很多人的第一反應可能會是廣度優先搜尋。但是對於乙個大小 o(mn) 的二維陣列,對每個位置進行四向搜尋,最壞情況的時間複雜度(即全是 1)會達到恐怖的 o(m2n2)。可以使用乙個 dp 陣列做 memoization,使得廣度優先搜尋不會重複遍歷相同位置.輸入:mat = [[0,0,0],[0,1,0],[0,0,0]]
輸出:[[0,0,0],[0,1,0],[0,0,0]]
另一種更簡單的方法是,先從左上到右下進行一次動態搜尋,即完成左、上兩個方向的查詢;再從右下到左上進行一次動態搜尋,即完成右、下兩個方向的查詢。兩次動態搜尋即可完成四個方向上的查詢。
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),只計算額外的空間複雜度。除了答案陣列以外,只需要常數空間存放若干變數。
力扣22 括號生成(動態規劃)
力扣22.括號生成 動態規劃 數字 n 代表生成括號的對數,請你設計乙個函式,用於能夠生成所有可能的並且 有效的 括號組合。示例 1 輸入 n 3 輸出 示例 2 輸入 n 1 輸出 1 n 8 反思 首先,面向小白 什麼是動態規劃?在此題中,動態規劃的思想類似於數學歸納法,當知道所有 i當我們清楚...
力扣記錄題思路(動態規劃篇)
5.最長回文子串 1 找中心 如果中心點的左邊和右邊值都相等,此子串就是乙個回文子串,然後往外擴大去判斷 2 動態規劃,k表示 i 和 j 的間隔長度,i 表示子串的首字元,j 表示子串的尾字元,先找到子串長度為0,1,2的所有回文子串,然後其他的更大的回文子串會判斷 dp i 1 j 1 s i ...
力扣日記 062 不同路徑 動態規劃
乙個機械人位於乙個 m x n 網格的左上角 起始點在下圖中標記為 start 機械人每次只能向下或者向右移動一步。機械人試圖達到網格的右下角 在下圖中標記為 finish 問總共有多少條不同的路徑?易知start finish需要m n 2個小方格,一定會有n 1個小方格是向右,m 1個方格向下。...