LeetCode-329. 矩阵中的最长递增路径
题目来源
题目详情
给定一个 m x n
整数矩阵 matrix
,找出其中 最长递增路径 的长度。
对于每个单元格,你可以往上,下,左,右四个方向移动。 你 不能 在 对角线 方向上移动或移动到 边界外(即不允许环绕)。
示例 1:
输入: matrix = [[9,9,4],[6,6,8],[2,1,1]]
输出: 4
解释: 最长递增路径为 [1, 2, 6, 9]
。
示例 2:
输入: matrix = [[3,4,5],[3,2,6],[2,2,1]]
输出: 4
解释: 最长递增路径是 [3, 4, 5, 6]
。注意不允许在对角线方向上移动。
示例 3:
输入: matrix = [[1]]
输出: 1
提示:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 200
0 <= matrix[i][j] <= 231 - 1
题解分析
解法一:深度优先搜索+记忆优化
本题很容易就想到是使用深度优先搜索方法求解可能的最长递增路径,需要遍历每一个方格作为起始结点进行搜索。
本题的一个亮点在于引入了记忆数组,通过记忆数组可以对递归过程进行剪枝,因为只要是记忆数组记录的节点,就说明这个节点出发的最长递增路径是已经确定的了,不需要再次递归求解。
class Solution {
int[][] dir= new int[][]{{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
public int longestIncreasingPath(int[][] matrix) {
int n = matrix.length;
int m = matrix[0].length;
int ans = 0;
int[][] longestPath = new int[n][m];
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
ans = Math.max(ans, dfs(matrix, i, j, longestPath) + 1);
}
}
return ans;
}
private int dfs(int[][] matrix, int i, int j, int[][] longestPath){
if(longestPath[i][j] != 0){
return longestPath[i][j];
}
int n = matrix.length;
int m = matrix[0].length;
for(int k=0; k<4; k++){
int di = i + dir[k][0];
int dj = j + dir[k][1];
if(di >=0 && di <n && dj >= 0 && dj < m && matrix[i][j] < matrix[di][dj]){
longestPath[i][j] = Math.max(longestPath[i][j], dfs(matrix, di, dj, longestPath) + 1);
}
}
return longestPath[i][j];
}
}
Either Excellent or Rusty
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了