最长递增路径java实现

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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值