LeetCode-329 Longest Increasing Path in a Matrix | 矩阵中的最长递增路径
题目描述
给定一个整数矩阵,找出最长递增路径的长度。
对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外(即不允许环绕)。
示例 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]。注意不允许在对角线方向上移动。
题目解析
这道题需要找出矩阵中最长递增的路径,且这条最长的递增路径的起点可以是矩阵中任意一个节点。
所以考虑使用枚举矩阵中每一个结点,来查找这个结点的最长递增路径,再对所有的长度进行比较得出最后的答案。
但是这种解题方式,会出现很多重复的计算,为了降低时间复杂度,考虑使用记忆化搜索,维护一个搜索结果的矩阵,每枚举一个结点,将这个结点的最长递增路径的值存储进去,可以重复使用,减少时间复杂度。
深度优先搜索时的细节点:
- 搜索时维护两个方向数组,dx = {0,0,1,-1},dy = {1,-1,0,0},通过dx,dy对应下标的加法来控制路径中的上下左右
- 注意边界条件的判断,通过计算出下一个结点nx,ny判断是否有数组越界问题
- 每次函数结束时需要更新维护的搜索结果矩阵
代码
class Solution {
//记忆化搜索
//维护一个和mat等大的二维数组,用于存储每个节点搜索的最大值,减少重复运行次数
//注意边界值
//mat,res,位置
public int longestIncreasingPath(int[][] matrix) {
if(matrix.length == 0){
return 0;
}
int[][] res = new int[matrix.length][matrix[0].length];
//boolean[][] visited = new boolean[matrix.length][matrix[0].length];
int max = 0;
for(int i = 0; i < matrix.length; i++){
for(int j = 0; j < matrix[0].length; j++){
max = Math.max(max, dfs(matrix,i,j,res));
}
}
return max;
}
public int dfs(int[][] mat, int x, int y, int[][] res){
if(res[x][y] != 0){
return res[x][y];
}
//上下左右
int[] dx = {0,0,1,-1};
int[] dy = {1,-1,0,0};
int m = mat.length;
int n = mat[0].length;
int len = 0;
for(int i = 0; i < 4; i++){
int nx = dx[i] + x;
int ny = dy[i] + y;
if(nx < m && nx >= 0 && ny < n && ny >= 0 && mat[nx][ny] > mat[x][y]){
//判断不越界,判断没走过, 判断nxny是否大于当前结点
len = Math.max(len, dfs(mat,nx,ny,res));
}
}
res[x][y] = len + 1;
return res[x][y];
}
}
版权声明:本文为weixin_43265151原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。