給定乙個整數矩陣,找出最長遞增路徑的長度。
對於每個單元格,你可以往上,下,左,右四個方向移動。 你不能在對角線方向上移動或移動到邊界外(即不允許環繞)。
示例 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]。注意不允許在對角線方向上移動。
【tle未ac】對每個節點深搜,找出最長路徑。在節點a最長路徑上的節點bcd們,其最長路徑一定比a的最長路徑短,所以路徑上的節點不會是其他最長路徑的開頭。
這種優化方式,只省掉了開頭,實際上經過1條路徑後,路徑上的節點bcd的最長路徑已經能求出來了,如果能用乙個dict儲存bcd的最長路徑,則後續節點碰到bcd時也可以直接用了,這樣可以更簡單。但是用棧的方式無法做記憶化,用遞迴會方便一些。
官方**太優雅了。。。學到了1個新招,可以在遞迴的函式前,加@lru_cache(none)
裝飾器,來加快速度。其中none
引數是記憶化的大小,maxsize = none
表示不做限制
tle的:
class
solution
:def
longestincreasingpath
(self, matrix: list[list[
int]])
->
int:
start_nodes =
[(row, col)
for row in
range
(len
(matrix)
)for col in
range
(len
(matrix[0]
))] max_len =
0while start_nodes:
start_row, start_col = start_nodes.pop(
) stack =
[(start_row, start_col,1)
]while stack:
row, col, path = stack.pop()if
(row, col)
in start_nodes:
start_nodes.remove(
(row, col)
) max_len =
max(max_len, path)
if row +
1<
len(matrix)
and matrix[row +1]
[col]
> matrix[row]
[col]
:(row +
1, col, path +1)
)if0<= row -
1and matrix[row -1]
[col]
> matrix[row]
[col]
:(row -
1, col, path +1)
)if col +
1<
len(matrix[0]
)and matrix[row]
[col +1]
> matrix[row]
[col]
:(row, col +
1, path +1)
)if0<= col -
1and matrix[row]
[col -1]
> matrix[row]
[col]
:(row, col -
1, path +1)
)return max_len
官方版:
class
solution
:
dirs =[(
-1,0
),(1
,0),
(0,-
1),(
0,1)
]def
longestincreasingpath
(self, matrix: list[list[
int]])
->
int:
ifnot matrix:
return
0
@lru_cache(
none
)def
dfs(row:
int, column:
int)
->
int:
best =
1for dx, dy in solution.dirs:
newrow, newcolumn = row + dx, column + dy
if0<= newrow < rows and
0<= newcolumn < columns and matrix[newrow]
[newcolumn]
> matrix[row]
[column]
: best =
max(best, dfs(newrow, newcolumn)+1
)return best
ans =
0 rows, columns =
len(matrix)
,len
(matrix[0]
)for i in
range
(rows)
:for j in
range
(columns)
: ans =
max(ans, dfs(i, j)
)return ans
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,...