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

矩阵最长递增路径

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

class Solution {
    
public:
    
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 递增路径的最大长度
     * @param matrix int整型vector<vector<>> 描述矩阵的每个数
     * @return int整型
     */
    int dfs(vector<vector<int> >& matrix, int i, int j, vector<vector<int>>& cnt)
    {
        if(cnt[i][j]>1)
        {
            return cnt[i][j]; // 已经访问过了
        }
        // cnt[i][j]++; // 不能连续时 值就是1
        int n = matrix.size(), m = matrix[0].size();
        
        // bool flag = false;
        // 4方向遍历
        int du[4] = {0, 0, -1, 1};
        int dv[4] = {-1, 1, 0, 0};
        for(int k=0; k<4; ++k)
        {
            int na = i + dv[k];
            int nb = j + du[k];
            if(na>=0 && na<n && nb>=0 && nb<m && matrix[i][j]<matrix[na][nb])// 满足可以继续
            {
                cnt[i][j] = max(cnt[i][j], dfs(matrix, na, nb, cnt)+1);//该cnt保存的是最大值,每个方向的后继路径
            }
        }

        return cnt[i][j];// 最终的最大值
        


    }
    int solve(vector<vector<int> >& matrix) {
        // write code here
        int n = matrix.size(), m = matrix[0].size();

        if(n==0 || m==0)
        {
            return 0;
        }

        vector<vector<int>> cnt(n, vector<int>(m, 1)); // 存储每个位置为起点的最长路径
        int l=0;
        // 遍历每个起点
        for(int i=0; i<n; ++i)
        {
            for(int j=0; j<m; ++j)
            {
                
                l = max(dfs(matrix, i, j, cnt), l); // 更新当前最大值

                
            }
        }

        
        return l;
    }
};

O(mn) O(mn) 参考官解写了一遍

和BM 57岛屿数量要一块连!

全部评论

相关推荐

北斗导航Compass低仿版:没必要写这么多东西,还是尽量浓缩成一页,自我评价,git和cursor Trae这些都可以去掉。实习经历的描述最好根据star法则改一下,别这么直白
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务