7.26 矩阵中的最长递增路径

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

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

示例 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]。注意不允许在对角线方向上移动。
通过次数19,623提交次数45,557
class Solution {
    int cnt = 0;
    int[][]dirs = {{0,1},{0,-1},{1,0},{-1,0}};
    public int longestIncreasingPath(int[][] matrix) {
        if(matrix.length==0 || matrix[0]==null) return 0;
        int m = matrix.length;//行
        int n = matrix[0].length;//列
        int [][] memo = new int[m][n];
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                dfs(matrix,m,n,i,j,memo);
            }
        }
        return cnt;
    }

    private int dfs(int[][] matrix,int m,int n, int i, int j,int [][] memo){
        if(memo[i][j]!=0){
            if(memo[i][j]>cnt) cnt=memo[i][j];
            return memo[i][j];
        }
        memo[i][j]++;
        for(int[] dir : dirs){
            int newrow = i+dir[0];
            int newcolumn = j+dir[1];
            if(newrow>=0 && newrow<m && newcolumn>=0 && newcolumn<n && matrix[newrow][newcolumn]>matrix[i][j]){
                memo[i][j] = Math.max(memo[i][j], dfs(matrix,m,n,newrow,newcolumn,memo)+1);
            }
        }
        if(memo[i][j]>cnt) cnt=memo[i][j];
        return memo[i][j];
    }
}
原文地址:https://www.cnblogs.com/athony/p/13379590.html