题解 | #矩阵最长递增路径#
矩阵最长递增路径
https://www.nowcoder.com/practice/7a71a88cdf294ce6bdf54c899be967a2
方法:深度优先搜索+动态规划
由于不知道以哪个位置作为起点能得到最长递增路径长度,所以需要遍历每个位置,找出每个位置为起点的最长路径长度,最后比较就可以得到整个矩阵的最大递增的长度了。而每个起点的下一位置可以是上下左右四个方向,又需要挨个遍历,选好一个点后又成了子问题,所以采用深度优先搜索方法,并且设置一个动态规划数组dp来记录每个位置的最大长度。
步骤:
1、排除空矩阵情况。
2、创建dp数组,遍历每个位置,通过调用深度优先搜索算法得到当前最大长度,维护最大长度。
3、由于需要遍历四个方向,所以可以设置一个数组来表示方向移动情况。
4、对于每个起点,使用dfs查找最长的递增路径:只要下一个位置比当前的位置数字大,就可以深入,同时累加路径长度。
import java.util.*; public class Solution { //上下左右四个方向移动一位的数组表示 int[][] directs = new int[][]{{-1,0},{1,0},{0,-1},{0,1}}; //递归,深度搜索,返回最大的路径长度。dp记录的是当前i,j位置的最大路径长度 private int n,m; public int dfs(int [][] matrix,int[][] dp,int i,int j){ //当前位置被访问过则跳过 if(dp[i][j]!=0){ return dp[i][j]; } //当前位置未被访问,路径长度加一 dp[i][j]++; //遍历四个方向 for(int k=0;k<4;++k){ int nexti = i + directs[k][0]; int nextj = j + directs[k][1]; //判断下一步是否可行 if(nexti>=0&&nexti<n&&nextj>=0&&nextj<m&&matrix[nexti][nextj]>matrix[i][j]){ dp[i][j] = Math.max(dp[i][j],dfs(matrix,dp,nexti,nextj)+1);//向下遍历,长度加一 } } return dp[i][j]; } public int solve (int[][] matrix) { n=matrix.length;//行数 m=matrix[0].length;//列数 if(n==0||m==0){ return 0; } int res=0; int [][] dp = new int[n+1][m+1]; for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ //找最大值 res = Math.max(res,dfs(matrix,dp,i,j)); } } return res; } }