給定乙個整數矩陣,找出最長遞增路徑的長度。
對於每個單元格,你可以往上,下,左,右四個方向移動。 你不能在對角線方向上移動或移動到邊界外(即不允許環繞)。
示例 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 ;
int column[4] = ;
int maxdepth = 1;
bool is_legal(int x, int y, int lenmatrix, int vis)
return false;
}void dfs(int dx, int dy, vector>& matrix, int depth, vector>& visited)
if(maxdepth < depth)
visited[dx][dy] = 1;
for(int k = 0; k < 4; k++)}}
int longestincreasingpath(vector>& matrix)
int len = matrix[0].size();
for(int i = 0; i < len; i++)
}return maxdepth;
}};
這種方法有乙個問題,那就是可能會出現重複搜尋問題,比如說假設當前有個鏈路1 --> 2 --> 6 --> 9,當深搜1這一輪是會遍歷這個鏈路,深搜2這一輪時有可能還是會遍歷這一輪,但是思考一下深搜1時遍歷出1 --> 2 --> 6 --> 9是最長情況,那麼遍歷2時不需要看也能知道最長路徑是2 --> 6 --> 9。所以我們可以記錄某乙個元素起始時最長路徑的長度,那麼當節點搜到它時,只需要直接加上它的路徑長度,不用重複搜尋了。
下面給出改進後的**:
解法二:帶有記憶的深搜
class solution ;
int column[4] = ;
bool is_legal(int x, int y, int lenx, int leny)
return false;
}int dfs(int dx, int dy, vector>& matrix, vector>& visited)
if(visited[dx][dy] > 0)
int temp = 0;
for(int k = 0; k < 4; k++)}}
visited[dx][dy] = temp+1;
return temp+1;
}int longestincreasingpath(vector>& matrix)
vector> visited(matrix.size(), vector(matrix[0].size(), 0));
int maxnum = 0;
for(int i = 0; i < matrix.size(); i++)}}
return maxnum;
}};
這種方法的主要思路在於:依次遍歷矩陣中的元素,對於每乙個元素,找四周比它小的元素的最長路徑,找到的最長路徑加一就是該元素的最長路徑。 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位元組跳動三面面試題。面試官提示我使用回溯...