题解 | 矩阵最长递增路径

矩阵最长递增路径

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

import java.util.*;


public class Solution {
    private static int result=0;
    private static int maxResult=0;
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 递增路径的最大长度
     * @param matrix int整型二维数组 描述矩阵的每个数
     * @return int整型
     */
    public int solve (int[][] matrix) {
        // write code here
           int[][] dp =new int[matrix.length][matrix[0].length];

           for(int r=0;r<matrix.length;r++){
            for(int j=0;j<matrix[0].length;j++){
                // dp 数组维护 以r j 为起点的最大的路径长度
                dfs(matrix,r,j,0,dp);
                // 当前路径长度
                dp[r][j]=result;
                maxResult=Math.max(result,maxResult);
                result=0;

            }
        }
        return maxResult;
    }
    // 我这个dfs 算法 是修改外部的路径 他的算法是没有问题的   但是可以拆解成分解子问题的形式 
     void dfs(int[][] grid, int i, int j,int path,int[][] dp){
        int m = grid.length, n = grid[0].length;
        if (i < 0 || j < 0 || i >= m || j >= n) {
            // 超出索引边界
            return;
        }




        // System.out.println("开始走方向");
        // // 开始走做
        // System.out.println(i);
        // System.out.println(j);
        // 进入当前节点 (i, j)
        path++;
        // 进入相邻节点(四叉树)
        // 上
        if( i-1>=0 &&  i-1<m && grid[i-1][j]>grid[i][j]){
            if(dp[i-1][j]!=0){
                result=Math.max(result,dp[i-1][j]+path);
               
            }else{
    dfs(grid, i - 1, j,path,dp);
            }
        
        }
        
        if( i+1>=0 && i+1<m && grid[i+1][j]>grid[i][j]){
            if(dp[i+1][j]!=0){
                result=Math.max(result,dp[i+1][j]+path);
             
            }else{
 dfs(grid, i + 1, j,path,dp);
            }
           
        }
        // 下
    
        // 左

        if( j-1>=0 && j-1<n && grid[i][j-1]>grid[i][j]){
            if(dp[i][j-1]!=0){
                result=Math.max(result,dp[i][j-1]+path);
            }else{
                 dfs(grid, i, j - 1,path,dp);
            }
           
        }
       
        if( j+1>=0 && j+1<n && grid[i][j+1]>grid[i][j]){
                if(dp[i][j+1]!=0){
                result=Math.max(result,dp[i][j+1]+path);
            }else{
                 dfs(grid, i, j + 1,path,dp);
            }
                 
        }
        // 右
        result=Math.max(result,path);
       
    }
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

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