YunYan

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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

题解:

一开始想的是枚举起点然后跑BFS,这样时间复杂度为o(n^2m^2),不太好。感觉官方题解的方法很秒,记忆化搜索,时间复杂度为O(nm),简单的介绍一下官方的思路,同样的,枚举每个起点,然后引入一个记忆化数组,如果这个点访问过了,直接返回该点对应的值,如果没有访问过,那么就访问该点的四个方向........代码还是比较好理解的。

class Solution {
    int dp[1000+7][1000+7];
    int direction[4][2]={{1,0},{0,1},{0,-1},{-1,0}};
public: 
    int longestIncreasingPath(vector<vector<int>>& matrix) {
        int n=matrix.size();
        if(n==0) return 0;
        int m=matrix[0].size();
        if(m==0) return 0;
        int ans=0; 
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                ans=max(ans,dfs(matrix,i,j,n,m));
            }
        }
        return ans;
    }
    int dfs(vector<vector<int >>&matrix,int x,int y,int n,int m){
        if(dp[x][y]) return dp[x][y];
        dp[x][y]=1;
        for(int i=0;i<4;i++){
            int dx=x+direction[i][0];
            int dy=y+direction[i][1];
            if(dx<0||dy<0||dx>=n||dy>=m||matrix[dx][dy]<=matrix[x][y]) continue ;
            dp[x][y]=max(dp[x][y],dfs(matrix,dx,dy,n,m)+1);
        }
        return dp[x][y];
    }
};

 

posted on 2020-08-16 21:13  Target--fly  阅读(125)  评论(0编辑  收藏  举报