牛客热题:矩阵最长递增路径

📟作者主页:慢热的陕西人

🌴专栏链接:力扣刷题日记

📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言

在这里插入图片描述

牛客热题:矩阵最长递增路径

题目链接

矩阵最长递增路径_牛客题霸_牛客网 (nowcoder.com)

方法一:DFS

思路

dfs:以(x, y)为起点进行递归:

​ 对于每个(x, y)来说,遍历它上下左右四个坐标,查看是否越界或者满足递增的要求;

​ 若是满足要求就继续递归满足要求的点

slove: 两重循环遍历矩阵中所有的点

代码

void dfs(vector<vector<int>>& matrix, vector<vector<int>>& st, int count, int x, int y, int& res)
    {
        array<int, 4> dx = {-1, 0, 1, 0};
        array<int, 4> dy = {0, 1, 0, -1};
        int n = st.size();
        int m = st[0].size();

        for(int i = 0; i < 4; ++i)
        {
            int X = x + dx[i], Y = y + dy[i];
            if(X < 0 || X >= n || Y < 0 || Y >= m)
            continue;

            if(st[X][Y] == 0 && matrix[X][Y] > matrix[x][y])
            {
                st[X][Y] = 1;
                dfs(matrix, st, count + 1, X, Y, res);
                st[X][Y] = 0;
            }
        }

        res = max(res, count);
    }
    
    int solve(vector<vector<int> >& matrix) 
    {   
        int n = matrix.size();
        int m = matrix[0].size();
        int res = 1;
        vector<vector<int>> st(n, vector<int>(m));
        for(int i = 0; i < n; ++i)
            for(int j = 0; j < m; ++j)
                dfs(matrix, st, 1, i, j, res);

        return res;
    }

复杂度

时间复杂度:

​ dfs的时间复杂度为O(m * n), 主函数调用了m * n次,所以总体的时间复杂度是O( ( m ∗ n ) 2 (m * n) ^ 2 (mn)2)

空间复杂度:

创建了一个和原矩阵空间大小相同的矩阵用于判断当前的左边是否被递归过,以及一些变量。

​ 所以总体上来说空间复杂度:O(n * m);

方法二:优化— 一个位置只递归一次

思路

  1. 动态规划缓存: dp 矩阵用来缓存已经计算过的路径长度,避免重复计算。
  2. 减少递归调用: 通过在每个位置初始化时只调用一次 DFS,减少了不必要的递归调用。
  3. 简化函数参数: 去掉了 st 矩阵和 count 参数,将 dp 矩阵用作缓存,count 的功能由 dp[x][y] 代替。

代码

class Solution {
public:
    void dfs(const vector<vector<int>>& matrix, vector<vector<int>>& dp, int x, int y, int& res) {
        array<int, 4> dx = {-1, 0, 1, 0};
        array<int, 4> dy = {0, 1, 0, -1};
        int n = matrix.size();
        int m = matrix[0].size();

        for (int i = 0; i < 4; ++i) {
            int X = x + dx[i], Y = y + dy[i];
            if (X < 0 || X >= n || Y < 0 || Y >= m || matrix[X][Y] <= matrix[x][y]) {
                continue;
            }
            if (dp[X][Y] == 0) {
                dfs(matrix, dp, X, Y, res);
            }
            dp[x][y] = max(dp[x][y], 1 + dp[X][Y]);
        }

        res = max(res, dp[x][y]);
    }

    int solve(vector<vector<int>>& matrix) {
        int n = matrix.size();
        if (n == 0) return 0;
        int m = matrix[0].size();
        vector<vector<int>> dp(n, vector<int>(m, 0));
        int res = 1;

        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < m; ++j) {
                if (dp[i][j] == 0) {
                    dp[i][j] = 1;
                    dfs(matrix, dp, i, j, res);
                }
            }
        }

        return res;
    }
};

复杂度

时间复杂度:

​ 相当于遍历一遍对应的矩阵O(n * m)

空间复杂度:

创建了一个和原矩阵同等空间的dp数组,则空间复杂度为O(n * m)

相关推荐

  1. 【打卡】网:BM61 矩阵递增路径

    2024-06-09 15:02:01       35 阅读
  2. 329. 矩阵中的递增路径

    2024-06-09 15:02:01       11 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-09 15:02:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-09 15:02:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-09 15:02:01       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-09 15:02:01       20 阅读

热门阅读

  1. web前端电影简介标签:深度解析与创意应用

    2024-06-09 15:02:01       12 阅读
  2. Android基础-事件分发机制

    2024-06-09 15:02:01       10 阅读
  3. Spring boot 集成Redis

    2024-06-09 15:02:01       11 阅读
  4. HTML实现进度条/加载框模版

    2024-06-09 15:02:01       9 阅读
  5. C++ 环形链表(解决约瑟夫问题)

    2024-06-09 15:02:01       10 阅读
  6. 前端高速成长的八个阶段

    2024-06-09 15:02:01       12 阅读
  7. Ethereum-Score-Hella怎么使用,举例说明

    2024-06-09 15:02:01       10 阅读
  8. Node.js 和 Vue 的区别的基本知识科普

    2024-06-09 15:02:01       10 阅读
  9. 谷神后端代码模板:导入

    2024-06-09 15:02:01       10 阅读
  10. Docker:认识Docker镜像

    2024-06-09 15:02:01       10 阅读
  11. elmentUI el-table 总结行

    2024-06-09 15:02:01       9 阅读