LeetCode:矩阵中的最长递增路径

题目链接:https://leetcode-cn.com/problems/longest-increasing-path-in-a-matrix/description/

给定一个整数矩阵,找出最长递增路径的长度。

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

示例 1:

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

输入: nums = 
[
  [3,4,5],
  [3,2,6],
  [2,2,1]
] 
输出: 4 
解释: 最长递增路径是 
[3, 4, 5, 6]
。注意不允许在对角线方向上移动。

思路:dp[i][j]代表以i,j为起点的最长的递增长度,防止重复计算(因为他的子路线肯定被算过了 当我们遍历到子路线的点是就不用计算了) dfs 深度搜索 遍历四个方向 只要不出界下个值比当前值大 则dfs子路线的最大长度数加一。

class Solution {  
    
    private int [][]dir={{0, -1}, {-1, 0}, {0, 1}, {1, 0}};
    private int [][]dp;
    public int dfs(int [][]matrix,int [][]dp,int i,int j){
           if(dp[i][j]>0)  //已经计算过的直接返回即可
               return dp[i][j];
      int n=matrix.length,m=matrix[0].length;
      int max=1;
        for(int k=0;k<4;k++){
          int x=dir[k][0]+i;
          int y=dir[k][1]+j;
            if(x<0||y<0||x>=n||y>=m||matrix[x][y]<=matrix[i][j]) 
                continue;
            int len=1+dfs(matrix,dp,x,y);
            max=Math.max(len,max);
        }
        dp[i][j]=max;
        return max;            
    }
    public int longestIncreasingPath(int[][] matrix) {
        if(matrix==null||matrix.length==0){
            return 0;
        }
        int n=matrix.length,m=matrix[0].length;
        dp=new int[n][m];
        int max=0;
          dp=new int[n][m];
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
              max=Math.max(dfs(matrix,dp,i,j),max);     
            }
        }
        return max;
    }
}

猜你喜欢

转载自blog.csdn.net/smile__dream/article/details/82144597
今日推荐