329. 矩陣中的最長遞增路徑
給定乙個整數矩陣,找出最長遞增路徑的長度。
對於每個單元格,你可以往上,下,左,右四個方向移動。 你不能在對角線方向上移動或移動到邊界外(即不允許環繞)。
示例 1:
輸入: nums =
[[9,9,4],
[6,6,8],
[2,1,1]
]輸出: 4
解釋: 最長遞增路徑為 [1, 2, 6, 9]。
示例 2:
輸入: nums =
[[3,4,5],
[3,2,6],
[2,2,1]
]輸出: 4
解釋: 最長遞增路徑是 [3, 4, 5, 6]。注意不允許在對角線方向上移動。
純暴力不加記錄表,超時!
class
solution
:def
longestincreasingpath
(self, matrix: list[list[
int]])
->
int:
self.maxlen =0if
not matrix:
return
0 m, n =
len(matrix)
,len
(matrix[0]
)def
backtrack
(i, j, cnt, pre)
: self.maxlen =
max(self.maxlen, cnt)if0
<= i < m and
0<= j < n and matrix[i]
[j]> pre :
backtrack(i+
1, j, cnt+
1, matrix[i]
[j])
backtrack(i-
1, j, cnt+
1, matrix[i]
[j])
backtrack(i, j+
1, cnt+
1, matrix[i]
[j])
backtrack(i, j-
1, cnt+
1, matrix[i]
[j])
else
:return
for i in
range
(m):
for j in
range
(n):
backtrack(i+
1, j,
1, matrix[i]
[j])
backtrack(i-
1, j,
1, matrix[i]
[j])
backtrack(i, j+1,
1, matrix[i]
[j])
backtrack(i, j-1,
1, matrix[i]
[j])
return self.maxlen
接下來加上乙個記錄**。加記錄表意味著我們在dfs函式需要返回當前前數字之後能夠達到的最遠長度。
而當前數字能夠達到的最遠長度又與和他相鄰的的四個點的最遠長度+1有關。這樣就可以得到乙個遞迴公式。
class
solution
:def
longestincreasingpath
(self, matrix: list[list[
int]])
->
int:
ifnot matrix:
return
0 m, n =
len(matrix)
,len
(matrix[0]
) out =
1 memo =
#每次都找比當前值小的數進行遞迴計數
defdfs
(i,j):if
(i,j)
in memo:
return memo[
(i,j)
] max_len =
0for di, dj in
[(i+
1, j)
,(i-
1, j)
,(i, j+1)
,(i, j-1)
]:if0
<= di < m and
0<= dj < n and matrix[di]
[dj]
< matrix[i]
[j]:
max_len =
max(max_len, dfs(di,dj)
)#從四個方案中找乙個最長的
memo[
(i,j)
]= max_len +
1#本次的值,比之前的值多乙個
return memo[
(i,j)
]#返回當前的最大長度
for i in
range
(m):
for j in
range
(n):
out =
max(out, dfs(i,j)
)return out
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,...