题解 | #矩阵最长递增路径,记忆化递归#

矩阵最长递增路径

http://www.nowcoder.com/practice/7a71a88cdf294ce6bdf54c899be967a2

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 递增路径的最大长度
     * @param matrix int整型二维数组 描述矩阵的每个数
     * @return int整型
     */
    public int solve (int[][] matrix) {
        if(matrix == null || matrix.length == 0 || matrix[0].length == 0) return 0 ;
        int rl = matrix.length ;
        int cl = matrix[0].length ;
        int res = 0 ;
        int[][] dp = new int[rl][cl] ;//dp[i][j]表示map[i][j]开头的最长递增路径的长度
        for(int i = 0 ; i < rl ; i ++) {
            for(int j = 0 ; j < cl ; j ++) {
                res = Math.max(res , dfs(matrix , dp , i , j)) ;
            }
        }
        return res ;
    }
    //记忆化递归,dp[i][j]表示map[i][j]开头的最长递增路径的长度
    //本函数的功能:找到以map[i][j]开头的最长递增路径的长度
    public int dfs(int map[][] , int[][] dp , int i , int j) {
        if(dp[i][j] != 0) return dp[i][j] ;
        dp[i][j] ++ ;
        int[][] deviation = {{-1 , 0} , {1 , 0} , {0 , -1} , {0 , 1}} ;//偏移:四个方向
        for(int x = 0 ; x < 4 ; x ++) {//枚举i,j四周的点
            int next_i = i + deviation[x][0] ;
            int next_j = j + deviation[x][1] ;
            //坐标合法且递增
            if(next_i >= 0 && next_i < map.length && next_j >= 0 && next_j < map[0].length && map[next_i][next_j] > map[i][j]) {
                dp[i][j] = Math.max(dp[i][j] , dfs(map , dp , next_i , next_j) + 1) ;//更新dp[i]
            }
        }
        return dp[i][j] ;
    }
}

一个菜鸟的算法刷题记录 文章被收录于专栏

分享一个菜鸟的成长记录

全部评论

相关推荐

真烦好烦真烦:豆包润色了自己没看看吗,再说了,都说豆包是愚蠢且勤快的大学生,ds才是聪明的研究生,怎么敢让豆包写论文的
点赞 评论 收藏
分享
king122:专业技能不要写这么多,熟悉和熟练你经不住问,排版有些难看,中间的空隙搞小一点,项目描述的话感觉是从课程中抄下来的,改一改吧,不然烂大街了,每个项目都写一两点,用什么技术实现了什么难点,然后再写一些数字上去像时间又花了90%这样,这样面试会多一些,如果觉得自己的项目还是不够用的话,我有几个大厂最近做过的实习项目,感兴趣的话可以看我简介中的项目地址
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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