0深度优先搜索中等 NC138 矩阵最长递增路径
程序员文章站
2022-05-20 16:45:47
...
描述
给定一个矩阵,矩阵内所有数均为非负整数。
求一条路径,该路径上所有数是递增的。
这个路径必须满足以下条件:
1、对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外。
2、你不能走重复的单元格。即每个格子最多只能走一次。
示例1
输入:[[1,2,3],[4,5,6],[7,8,9]]。
返回值:5
说明:1->2->3->6->9即可。当然这种递增路径不是唯一的。
- 最长路径可以从任意节点出发,所以需要便利所有的节点
- 以某一节点出发,遍历这个节点的上下左右,当遇到比他更大的节点则递归遍历该节点,当所有的遍历结束,便可得到从该节点出发的最长路径长度。
代码:
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 递增路径的最大长度
* @param matrix int整型二维数组 描述矩阵的每个数
* @return int整型
*/
public int solve (int[][] matrix) {
// write code here
if(matrix == null){
return 0;
}
int max = 0;
for(int i = 0; i < matrix.length; i++){
for(int j = 0; j < matrix[0].length; j++){
max = Math.max(max,islandDFS(matrix,i,j,-2));
}
}
return max;
}
public int islandDFS(int[][] arr, int a, int b, int pre){
//遇到越界或比当前节点小的节点则返回0结束遍历
if(a < 0 || a == arr.length || b < 0 || b == arr[0].length || arr[a][b] <= pre){
return 0;
}
int max = islandDFS(arr,a+1,b,arr[a][b]);
max = Math.max(max,islandDFS(arr,a-1,b,arr[a][b]));
max = Math.max(max,islandDFS(arr,a,b+1,arr[a][b]));
max = Math.max(max,islandDFS(arr,a,b-1,arr[a][b]));
return max+1;
}
}