329. Longest Increasing Path in a Matrix
329. Longest Increasing Path in a Matrix
💡
在做這個題目之前可以先完成 200. Number of Islands
這個題目需要分成兩個階段來思考。
第一個階段是,題目所求的最長遞增路徑是可以從任意點出發的,當任選一個點出發後,該次旅程不能重複造訪其他點,因此需要遍歷每個點來找到最大值,遍歷的方式很簡單,並且搭配 DFS 就可以完成。
第二個部分是,在遍歷每個點去找出最大值的時候,可以觀察出另一件事情,那就是在找到最大值的路上,會有很多重複的路徑。
例如,當前位置的值是 8 ,他的周圍有 7 和 9 ,根據題目設定,會前往去 9 的位置。既然 7 和 8 相連,8 也比 7 小,那當位置是在 7 的時候,就可以往 8 走,但是一但走到 8 的時候,如果 8 已經探索完了,只需要繼承走過 8 這個點的記憶就好,因此這個第二階段就是透過動態規劃的記憶法來輔助找尋答案。
- 深度優先搜索
- 動態規劃記憶法
class Solution:
def longestIncreasingPath(self, matrix: List[List[int]]) -> int:
rows = len(matrix)
cols = len(matrix[0])
ans = defaultdict(int)
directions = [(1, 0), (0, 1), (-1, 0), (0, -1)]
def findMax(row, col):
if (row, col) in ans:
return ans[(row, col)]
for dr, dc in directions:
nr, nc = row + dr, col + dc
if 0 <= nr < rows and 0 <= nc < cols and matrix[nr][nc] > matrix[row][col]:
ans[(row, col)] = max(ans[(row, col)], findMax(nr, nc))
# 需要在後面補一,如果先補一的話,有可能在 findMax 遞迴中,會撞上 Base case ,造成計算錯誤。
ans[(row, col)] += 1
return ans[(row, col)]
for row in range(rows):
for col in range(cols):
findMax(row, col)
print(ans)
return max(ans.values())