矩陣中的最長遞增路徑

2021-10-08 13:29:26 字數 1539 閱讀 5462

矩陣中的最長遞增路徑

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

對於每個單元格,你可以往上,下,左,右四個方向移動。

你不能在對角線方向上移動或移動到邊界外(即不允許環繞)

題解

首先看到這道題,突然想到島嶼那題,每次向著四個方向不斷遞迴

只是條件是只遞迴比當前數大的數,所以使用深度搜尋,並且返回搜尋中深度最大的乙個,然後就就開始巴拉巴拉一頓操作,測試,沒問題,上線,超時,一口老血吐出來(意料中)

所以就做了優化,每次我們都對乙個數進行了一次深搜,所以超時的部分其實是很多點都做了重複的計算

那麼就借助乙個記憶區間記錄已經查詢過的數,如果當前的數已經計算過,那麼就可以在記憶區直接拿,不用再次計算

public

class

longestincreasingpath

int ans=0;

memo=

newint

[matrix.length]

[matrix[0]

.length]

;for

(int i=

0;ireturn ans;

}private

static

intdfs

(int

matrix,

int r,

int c)

int top=0;

int bottom=0;

int left=0;

int right=0;

//向上遞迴

if(matrix[r]

[c]!=-1

&&r>=

1&&matrix[r-1]

[c]>matrix[r]

[c])

else

}//向下遞迴

if(matrix[r]

[c]!=-1

&&r<=matrix.length-

2&&matrix[r+1]

[c]>matrix[r]

[c])

else

}//向左遞迴

if(matrix[r]

[c]!=-1

&&c>=

1&&matrix[r]

[c-1

]>matrix[r]

[c])

else

}//向右遞迴

if(matrix[r]

[c]!=-1

&&c<=matrix[0]

.length-

2&&matrix[r]

[c+1

]>matrix[r]

[c])

else

} memo[r]

[c]=math.

max(top,math.

max(bottom,math.

max(left,right)))

+1;return memo[r]

[c];

}}

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位元組跳動三面面試題。面試官提示我使用回溯...