题解 | #矩阵最长递增路径#

矩阵最长递增路径

https://www.nowcoder.com/practice/7a71a88cdf294ce6bdf54c899be967a2

class Solution {
    vector<int> direction = {-1, 0, 1, 0, -1};
    int dfs(vector<vector<int>>& matrix, int x, int y, vector<vector<int>>& dp){
	  // 如果不为零,说明在之前的递归中已经计算过以(x, y)为起点的最长路径,此时直接返回即可
        if(dp[x][y]!=0) return dp[x][y];
	  // 1. 如果为零,首先赋值自身为1
        dp[x][y] = 1;
	  // 2. 分别从四个方向出发计算最长路径长度
        for(int k=0; k<4; ++k){
            int xx = x + direction[k];
            int yy = y + direction[k+1];
		  // 3. 先判断是否越界,再判断大小是否满足递增
            if(xx>=0 && xx<matrix.size() && yy>=0 && yy<matrix[0].size() && matrix[xx][yy]>matrix[x][y]){
			  // 4. 取不同搜索方向中的最长路径
                dp[x][y] = max(dp[x][y], 1+dfs(matrix, xx, yy, dp));
            }
        }
        return dp[x][y];
    }
public:
    /**
     * 递增路径的最大长度
     * @param matrix int整型vector<vector<>> 描述矩阵的每个数
     * @return int整型
     */
    int solve(vector<vector<int> >& matrix) {
        int m = matrix.size();
        int n = matrix[0].size();
        // dp[i][j]代表以matrix[i][j]为起点的最长递增路径长度
        vector<vector<int>> dp(m, vector<int>(n));
        int res = 0;
        for(int i=0; i<m; ++i){
            for(int j=0; j<n; ++j){
			  // 以不同坐标元素为起点计算最长路径长度,取最大者
                res = max(res, dfs(matrix, i, j, dp));
            }
        }
        return res;
    }
};

全部评论

相关推荐

06-06 03:40
已编辑
电子科技大学 Java
在秋招的小白菜很想养修勾:一眼 苍穹外卖+谷粒商城,项目换一换吧,可以找一些付费知识星球博主带带,避免烂大街。多投投大厂,背背八股,你这学历乱杀了,等实习经验到位,到时候大厂闭眼选
投递美团等公司7个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务