LeetCode:矩阵最长递增路径

329:给定一个 m x n 整数矩阵 matrix ,找出其中 最长递增路径 的长度。

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

class Solution {
    private int[][] memo;
    private int[][] matrix;
    public int longestIncreasingPath(int[][] matrix) {
        int m = matrix.length;
        int n = matrix[0].length;
        this.memo = new int[m][n];
        this.matrix = matrix;
        int maxLength = Integer.MIN_VALUE;
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(memo[i][j]!=0){
                    continue;
                }
                //若遇到没有遍历过的位置,由于没有上一个值,需要手动向四周扩散
                int val = matrix[i][j];
                int left = dfs(matrix,i,j-1,val);
                int right = dfs(matrix,i,j+1,val);
                int up = dfs(matrix,i-1,j,val);
                int down = dfs(matrix,i+1,j,val);
                //到达当前位置的最长距离,即挑选四周最长的长度,并且挑选四周中比自己小的
                memo[i][j] = Math.max(Math.max(left,right),Math.max(up,down))+1;
            }
        }
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                maxLength = Math.max(maxLength,memo[i][j]);
            }
        }
        return maxLength;

    }

    public int dfs(int[][] matrix,int row,int col,int lastNum){
        //越界
        if(row<0||row>matrix.length-1||col<0||col>matrix[0].length-1){
            return 0;
        }
        //如果比上一个值大,终止
        if(matrix[row][col]>=lastNum){
            return 0;
        }
        if(memo[row][col]!=0){
            return memo[row][col];
        }
        int val = matrix[row][col];
        //四周遍历
        int left = dfs(matrix,row,col-1,val);
        int right = dfs(matrix,row,col+1,val);
        int up = dfs(matrix,row-1,col,val);
        int down = dfs(matrix,row+1,col,val);
        //到达当前位置的最长距离,即挑选四周最长的长度,并且挑选四周中比自己小的
        memo[row][col] = Math.max(Math.max(left,right),Math.max(up,down))+1;
        return memo[row][col];
    }


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值