leetcode329 矩陣中的最長遞增路徑

2021-10-23 20:23:49 字數 1099 閱讀 4115

傳送門

題目: 給定乙個整數矩陣,找出最長遞增路徑的長度。 對於每個單元格,你可以往上,下,左,右四個方向移動。 你不能在對角線方向上移動或移動到邊界外(即不允許環繞)。

輸入: nums =[[

9,9,

4],[

6,6,

8],[

2,1,

1]] 輸出:

4 解釋: 最長遞增路徑為 [1,

2,6,

9]。

記憶化深度優先搜尋
如果直接用dfs搜尋,一定會超時,因為一條已經計算過的路徑上的所有節點都要開始dfs一次。

所以,我們最好把之前搜尋的結果快取下來,

等我們要把當前節點加入到已有路徑時,直接把記憶的路徑長度+

1(+1時加上當前節點)

這樣每個子問題只需要計算一次。

快取陣列: dp[i]

[j] 代表以 i行j列的節點 為首或者尾的路徑長度

在本問題中,我們多次遞迴呼叫 dfs

(i,j) 。

但是,如果我們如果已經知道和matrix[i]

[j]相鄰的四個單位置的結果(dp路徑值),

就只需要常數時間就可得到ij的dp值。

所以 dfs裡:

1. 先判斷 ij上下左右四個位置索引是不是有效

2. 再判斷某個位置的值是不是比matrix[i]

[j]大,注意這裡是大,不是小,因為路徑端點比它大,它才能加入路徑

final

int[

] dir =

newint

,,,}

;public

intlongestincreasingpath

(int

matrix)

}return ans;

}int

dfs(

int[

] matrix,

int[

] dp,

int i,

int j)

return dp[i]

[j];

}

LeetCode329 矩陣中的最長遞增路徑

遍歷每乙個元素 i 看它的上下左右都是否比它大,假如 j 比 i 大,那麼就在 比 j 大的個數的基礎上 1。簡單說就是挨個去找每個元素到底有幾個數字比它大,然後把結果儲存起來,最後找出來最大的。題目也不難,主要是dfs 之前沒有寫過,自己寫了乙個十幾個的if語句 哪兒有這麼差的 嘛。主要就是記錄一...

Leetcode 329 矩陣中的最長遞增路徑

給定乙個整數矩陣,找出最長遞增路徑的長度。對於每個單元格,你可以往上,下,左,右四個方向移動。你不能在對角線方向上移動或移動到邊界外 即不允許環繞 示例 1 輸入 nums 9,9,4 6,6,8 2,1,1 輸出 4 解釋 最長遞增路徑為 1,2,6,9 示例 2 輸入 nums 3,4,5 3,...

leetcode329 矩陣中的最長遞增路徑

給定乙個整數矩陣,找出最長遞增路徑的長度。對於每個單元格,你可以往上,下,左,右四個方向移動。你不能在對角線方向上移動或移動到邊界外 即不允許環繞 示例 1 輸入 nums 9,9,4 6,6,8 2,1,1 輸出 4 解釋 最長遞增路徑為 1,2,6,9 示例 2 輸入 nums 3,4,5 3,...