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

2021-10-08 12:53:56 字數 3089 閱讀 9856

給定乙個整數矩陣,找出最長遞增路徑的長度。

對於每個單元格,你可以往上,下,左,右四個方向移動。 你不能在對角線方向上移動或移動到邊界外(即不允許環繞)。

示例 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,...