class Solution { public int longestIncreasingPath(int[][] matrix) { //这一题需要我们寻找最长的递增路径,也就是说递减的路径就无用,所以它是一个有向图,由于大的数不会再回头指向小的所以它是一个无环图。我们这一次更关心的是路劲所以我们选用的是深度优先搜索算法,由于矩阵中的每一个节点都可能是起始节点所以我们必须要遍历所有的节点才能找到那个最大的路劲。为了避免重复计算我们使用一个二维数组来缓存已经计算过的节点。 //如果矩阵为空无从搜索 if(matrix.length == 0 || matrix[0].length == 0){ return 0; } int max = 1; int lengths[][] = new int[matrix.length][matrix[0].length]; //把每一个节点都作为其实节点来遍历 for(int i = 0;i < matrix.length;i++){ for(int j = 0;j < matrix[0].length;j++){ max = Math.max(dfs(lengths,matrix,i,j),max); } } return max; } private int dfs(int[][] lengths,int[][] matrix,int i,int j){ //为了避免重复的递归如果已经计算好的节点可以直接使用 if(lengths[i][j] != 0){ return lengths[i][j]; } //以i,j为起始节点进行广度优先搜索 //定义上下左右四个节点 int[][] dirs = {{-1,0},{1,0},{0,-1},{0,1}}; //定义初始的长度 int length = 1; //对于广度优先的递归代码来说每个节点需要遍历它的符合条件的上下左右节点,直到找到一个可以返回的位置 for(int[] dir : dirs){ int r = i + dir[0]; int c = j + dir[1]; if((r >= 0 && r < matrix.length)&&(c >= 0 && c < matrix[0].length)&&matrix[i][j] < matrix[r][c]){ int path = dfs(lengths,matrix,r,c); length = Math.max(length,path + 1); } } //如果上下左右都遍历了而且无从递归了长度就是length了 lengths[i][j] = length; return length; } }