leetcode329. 矩阵中的最长递增路径(dfs)

145 阅读1分钟
给定一个整数矩阵,找出最长递增路径的长度。

对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外(即不允许环绕)。

示例 1:

输入: nums = 
[
  [9,9,4],
  [6,6,8],
  [2,1,1]
] 
输出: 4 
解释: 最长递增路径为 [1, 2, 6, 9]。

代码

class Solution {
    int[][] check;
    public int longestIncreasingPath(int[][] matrix) {
        int[][] dir = new int[][]{{-1, 0}, {1, 0}, {0, 1}, {0, -1}};
        if(matrix.length==0) return 0;
        int n=matrix.length,m=matrix[0].length;
        check=new int[n][m];//记录下节点的最长递增路径
        int res=0;
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
            {
                if(check[i][j]==0)//当前没有计算路径长度
                    IncreasingPath(matrix,i,j,dir);
                res= Math.max(res,check[i][j]);//比较得出最大值
            }
                
       return  res;
    }
    public int IncreasingPath(int[][] matrix,int x,int y,int[][] dir) {

        if(check[x][y]!=0) return check[x][y];
        int temp=0;
        check[x][y]=1;//以当前节点为起点
        for(int[] d:dir)//遍历4个方向
        {
            int nextX=d[0]+x,nextY=d[1]+y;
            if(nextX<0||nextY<0||nextX>=matrix.length||nextY>=matrix[0].length||matrix[nextX][nextY]<=matrix[x][y]) continue;
            //不满足的节点不访问
            temp= Math.max(temp,IncreasingPath(matrix,nextX,nextY,dir));//找出最长路径
        }
        check[x][y]+=temp;
        return check[x][y];
    }
}