動態規劃 力扣542 01矩陣

2022-10-10 06:06:11 字數 1418 閱讀 7402

給定乙個由 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),只計算額外的空間複雜度。除了答案陣列以外,只需要常數空間存放若干變數。

力扣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個方格向下。...