题解 | #矩阵最长递增路径#

矩阵最长递增路径

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;
    }
}
全部评论

相关推荐

06-08 22:25
门头沟学院 Java
从零开始的转码生活:这hr不会打开手机不分青红皂白给所有人群发这句话,过一会再给所有人再发一遍,这肯定会有重复的,不管,再过一会再发一遍
点赞 评论 收藏
分享
昨天 16:39
已编辑
门头沟学院 测试开发
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务