給定乙個整數矩陣,找出最長遞增路徑的長度。
對於每個單元格,你可以往上,下,左,右四個方向移動。 你不能在對角線方向上移動或移動到邊界外(即不允許環繞)。
通過乙個memo記錄深度優先搜尋的結果,如果在dfs過程中,memo不為0證明已經搜尋過,直接獲得結果。
class
solution
;static
constexpr
int dy[4]
=;int m, n;
intlongestincreasingpath
(vectorint>>
& matrix)
m = matrix.
size()
, n = matrix[0]
.size()
; vectorint>>
memo
(m, vector<
int>
(n,0))
;int ans =0;
for(
int i =
0; i < m; i++)}
return ans;
}int
dfs(vectorint>>
& matrix, vectorint>>
& memo,
int x,
int y)
memo[x]
[y]++
;for
(int i =
0; i <
4; i++)}
return memo[x]
[y];}}
;
和拓撲排序一樣,矩陣的乙個值均大於四周的值時,入度為0,矩陣的值均小於四周的值時,入度為4,讓入度為0的點進入佇列,利用對立進行廣度優先搜尋,再讓入度變為0的點再次進入佇列,直到搜尋完畢。
class
solution
;static
constexpr
int dy[4]
=;int m, n;
intlongestincreasingpath
(vectorint>>
& matrix)
m = matrix.
size()
, n = matrix[0]
.size()
; vectorint>>
memo
(m, vector<
int>
(n,0))
;for
(int i =
0; i < m; i++)}
}}queueint,
int>> q;
for(
int i =
0; i < m; i++))
;}}}
int ans =0;
while
(!q.
empty()
));}
}}}}
return ans;}}
;
329 矩陣中的最長遞增路徑
給定乙個整數矩陣,找出最長遞增路徑的長度。對於每個單元格,你可以往上,下,左,右四個方向移動。你不能在對角線方向上移動或移動到邊界外 即不允許環繞 示例 1 輸入 nums 9,9,4 6,6,8 2,1,1 輸出 4 解釋 最長遞增路徑為 1,2,6,9 示例 2 輸入 nums 3,4,5 3,...
329 矩陣中的最長遞增路徑
給定乙個整數矩陣,找出最長遞增路徑的長度。對於每個單元格,你可以往上,下,左,右四個方向移動。你不能在對角線方向上移動或移動到邊界外 即不允許環繞 示例 1 輸入 nums 9,9,4 6,6,8 2,1,1 輸出 4 解釋 最長遞增路徑為 1,2,6,9 dfs 記憶矩陣 儲存以該點位起點的最長路...
329 矩陣中的最長遞增路徑
題目 型別 深搜 記憶化遞迴 難度 困難 題意 從乙個二維矩陣中找到乙個嚴格遞增的路徑。使用深度搜尋,不需要標記,因為到當前點是需要滿足比原來點數值大的,所以也不會重複遍歷。然後使用記憶化遞迴記錄最長的路徑,如果已經計算過了直接返回。備註 2020.4.18位元組跳動三面面試題。面試官提示我使用回溯...