LeetCode 0329. 矩阵中的最长递增路径

Posted Tisfy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 0329. 矩阵中的最长递增路径相关的知识,希望对你有一定的参考价值。

【LetMeFly】329.矩阵中的最长递增路径:从大到小处理的动态规划

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

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

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

 

示例 1:

输入:matrix = [[9,9,4],[6,6,8],[2,1,1]]
输出:4 
解释:最长递增路径为 [1, 2, 6, 9]

示例 2:

输入:matrix = [[3,4,5],[3,2,6],[2,2,1]]
输出:4 
解释:最长递增路径是 [3, 4, 5, 6]。注意不允许在对角线方向上移动。

示例 3:

输入:matrix = [[1]]
输出:1

 

提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 200
  • 0 <= matrix[i][j] <= 231 - 1

方法一:从大到小处理的动态规划

因为路径必须是严格递增的,因此如果从地图中最大的值开始,“最长递增路径”就是“1”(因为没有比它更大的了)

处理完最大的数,我们就可以处理“第二大”的数了。第二大的数周如果有第一大的数,那么从这个第二大的数开始出发,“最长递增路径”为“2”

接着我们可以处理第三大的数、第四大的数、……

总之,只需要将原始地图中的元素按从大到小的顺序排个序(注意排序过程中,元素在地图中的原始位置信息不要丢失),就能从大到小开始遍历。遍历到一个数时,看这个数的四周有没有比它大的数,如果有,从这个数出发的“最长递增路径”就可以是“从它旁边比它大的数出发的最长路径 + 1”

整个过程中,不断更新“从某个点出发的最长递增路径”的最大值 即为答案。

  • 时间复杂度 O ( m n ) O(m n) O(mn)
  • 空间复杂度 O ( m n × log ⁡ ( m n ) ) O(m n\\times \\log (m n)) O(mn×log(mn))

AC代码

C++

struct MyNode 
    int x, y;
    int val;
;

bool cmp(const MyNode& a, const MyNode& b) 
    return a.val > b.val;


const int directions[4][2] = -1, 0, 1, 0, 0, -1, 0, 1;

class Solution 
public:
    int longestIncreasingPath(vector<vector<int>>& matrix) 
        int n = matrix.size(), m = matrix[0].size();
        vector<MyNode> nodes;
        for (int i = 0; i < n; i++) 
            for (int j = 0; j < m; j++) 
                nodes.push_back(i, j, matrix[i][j]);
            
        
        sort(nodes.begin(), nodes.end(), cmp);
        vector<vector<int>> dp(n, vector<int>(m, 1));
        int ans = 1;
        for (MyNode thisNode : nodes) 
            int x = thisNode.x, y = thisNode.y;
            int val = thisNode.val;
            for (int d = 0; d < 4; d++) 
                int tx = x + directions[d][0];
                int ty = y + directions[d][1];
                if (tx >= 0 && tx < n && ty >= 0 && ty < m) 
                    if (matrix[tx][ty] > val) 
                        dp[x][y] = max(dp[x][y], dp[tx][ty] + 1);
                    
                
            
            ans = max(ans, dp[x][y]);
        
        return ans;
    
;

同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/127043063

以上是关于LeetCode 0329. 矩阵中的最长递增路径的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode. 矩阵中的最长递增路径

python-leetcode329-深度优先搜索矩阵中的最长递增路径

LeetCode329. 矩阵中的最长递增路径(Java)

leetcode-329-矩阵中的最长递增路径

LeetCode 329. 矩阵中的最长递增路径

leetcode之329矩阵中的最长递增路径Golang