力扣算法题链接:

https://leetcode-cn.com/problems/longest-increasing-path-in-a-matrix/
给定一个 m x n 整数矩阵 matrix ,找出其中 最长递增路径 的长度。
对于每个单元格,你可以往上,下,左,右四个方向移动。 你 不能 在 对角线 方向上移动或移动到 边界外(即不允许环绕)。

解题方法:深度优先遍历+记忆举证
memo:用来存放结果的记忆矩阵

    public int[][] dirs = {{-1,0},{1,0},{0,1},{0,-1}};//记录方向
    public int rows,columns;//全局行列数
    public int longestIncreasionPath(int[][] matrix){
        if(matrix == null|| matrix.length == 0 || matrix[0].length == 0){
            return 0;
        }
      
        int ans = 0;//结果
        rows = matrix.length;
        columns = matrix[0].length;
  //创建记忆矩阵,用来记录长度
        int[][] memo = new int[rows][columns];
        for(int i = 0;i < rows;i++){
            for (int j = 0;j < columns;j++){
                ans = Math.max(ans,dfs(matrix,i,j,memo));
            }
        }
        return ans;
    }

    private int dfs(int[][] matrix, int row, int column, int[][] memo) {
        if(memo[row][column] != 0){
            //如果当前记忆矩阵部位0,说明已经搜索计算过递归的长度了
            return memo[row][column];
        }
        //如果为0;就增加1代表起始长度为1
        memo[row][column]++;
        //进行上下左右移动
        for (int[] dir : dirs) {
            int newRow = row + dir[0];
            int newColumn = column + dir[1];
            if(newRow >= 0 && newRow < rows && newColumn >= 0&&newColumn < columns && matrix[newRow][newColumn] > matrix[row][column]){
                memo[row][column] = Math.max(memo[row][column],dfs(matrix,newRow,newColumn,memo)+1);
            }
        }
        return memo[row][column];
    }
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-increasing-path-in-a-matrix
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
posted on 2021-03-12 14:06  东宁王孟川  阅读(86)  评论(0)    收藏  举报