矩陣中的最長遞增路徑
給定乙個整數矩陣,找出最長遞增路徑的長度。
對於每個單元格,你可以往上,下,左,右四個方向移動。
你不能在對角線方向上移動或移動到邊界外(即不允許環繞)
題解:
首先看到這道題,突然想到島嶼那題,每次向著四個方向不斷遞迴
只是條件是只遞迴比當前數大的數,所以使用深度搜尋,並且返回搜尋中深度最大的乙個,然後就就開始巴拉巴拉一頓操作,測試,沒問題,上線,超時,一口老血吐出來(意料中)
所以就做了優化,每次我們都對乙個數進行了一次深搜,所以超時的部分其實是很多點都做了重複的計算
那麼就借助乙個記憶區間記錄已經查詢過的數,如果當前的數已經計算過,那麼就可以在記憶區直接拿,不用再次計算
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位元組跳動三面面試題。面試官提示我使用回溯...