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

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

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

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

文章目录

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

题目链接

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

方法一:DFS

思路

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

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

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

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

代码

cpp 复制代码
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 (m∗n)2)

空间复杂度:

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

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

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

思路

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

代码

cpp 复制代码
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)

相关推荐
naturerun16 小时前
螺旋形遍历奇数阶矩阵
c++·算法·矩阵
05候补工程师21 小时前
【线性代数】考研复习万字长文:从“工厂模型”到矩阵变换,重构线代底层逻辑
线性代数·考研·矩阵·重构
AI科技星21 小时前
第 24 分册:濒死体验与灵魂出窍·数理修行篇(2026 年 5 月 11 日增补版)
人工智能·线性代数·机器学习·量子计算·agi
小雅痞21 小时前
[Java][Leetcode middle] 54. 螺旋矩阵
java·leetcode·矩阵
Controller-Inversion1 天前
240. 搜索二维矩阵 II
线性代数·算法·矩阵
yong99901 天前
基于 STM32 的 4×4 矩阵键盘源码
stm32·矩阵·计算机外设
AI科技星2 天前
卷十二:奔跑吧水轮·环境能捕获与全域熵源 (正式典籍版)
人工智能·线性代数·机器学习·量子计算·agi
科研前沿2 天前
像素级实景映射,构建实景孪生底层新范式
科技·矩阵·音视频
Tisfy2 天前
LeetCode 1914.循环轮转矩阵:大模拟(数组原地轮转) —— 附O(1)空间版本
算法·leetcode·矩阵·大模拟
sheeta19982 天前
LeetCode 每日一题笔记 日期:2026.05.09 题目:1914. 循环轮转矩阵
笔记·leetcode·矩阵