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