Leetcode 329, Longest Increasing Path in a Matrix


Native的DFS,TLE:

public int longestIncreasingPath(int[][] matrix) {
        if(matrix==null||matrix.length==0||matrix[0].length==0)
            return 0;
     
        int[] max = new int[1];
        for(int i=0; i<matrix.length; i++)    {
            for(int j=0; j<matrix[0].length; j++){
                dfs(matrix, i, j, max, 1);
            }
        }
     
        return max[0];
    }
     
    public void dfs(int[][] matrix, int i, int j, int[] max, int len){
     
        max[0]=Math.max(max[0], len);
     
        int m=matrix.length;
        int n=matrix[0].length;
        
        if(i + 1>=0 && i + 1<m && j>=0 && j<n && matrix[i + 1][j]>matrix[i][j]){
            dfs(matrix, i + 1, j, max, len+1);
        }
        if(i - 1>=0 && i - 1<m && j>=0 && j<n && matrix[i - 1][j]>matrix[i][j]){
            dfs(matrix, i - 1, j, max, len+1);
        }
        if(i>=0 && i<m && j + 1>=0 && j + 1<n && matrix[i][j + 1]>matrix[i][j]){
            dfs(matrix, i, j + 1, max, len+1);
        }
        if(i>=0 && i<m && j - 1>=0 && j - 1<n && matrix[i][j - 1]>matrix[i][j]){
            dfs(matrix, i, j - 1, max, len+1);
        }
        
    }

加上DP:

    public int longestIncreasingPath(int[][] matrix) {
        if(matrix==null||matrix.length==0||matrix[0].length==0)
            return 0;
 
        int[][] mem = new int[matrix.length][matrix[0].length];
        int max=0;
 
        for(int i=0; i<matrix.length; i++){
            for(int j=0; j<matrix[0].length; j++){
                max = Math.max(max, dfs(matrix, i, j, mem));
            }
        }
 
        return max;
    }
 
    public int dfs(int[][] matrix, int i, int j,  int[][] mem){
        if(mem[i][j]!=0)
            return mem[i][j];
 
        if(i+1>=0&&j>=0&&i+1<matrix.length&&j<matrix[0].length&&matrix[i+1][j]>matrix[i][j]){
            mem[i][j]=Math.max(mem[i][j], dfs(matrix, i+1, j, mem));
        }
        if(i-1>=0&&j>=0&&i-1<matrix.length&&j<matrix[0].length&&matrix[i-1][j]>matrix[i][j]){
            mem[i][j]=Math.max(mem[i][j], dfs(matrix, i-1, j, mem));
        }
        if(i>=0&&j+1>=0&&i<matrix.length&&j+1<matrix[0].length&&matrix[i][j+1]>matrix[i][j]){
            mem[i][j]=Math.max(mem[i][j], dfs(matrix, i, j+1, mem));
        }
        if(i>=0&&j-1>=0&&i<matrix.length&&j-1<matrix[0].length&&matrix[i][j-1]>matrix[i][j]){
            mem[i][j]=Math.max(mem[i][j], dfs(matrix, i, j-1, mem));
        }
 
        return ++mem[i][j];
    }


refer: http://www.programcreek.com/2014/05/leetcode-longest-increasing-path-in-a-matrix-java/











  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值