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

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

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

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

文章目录

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

题目链接

矩阵最长递增路径_牛客题霸_牛客网 (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)

相关推荐
Raas10019 小时前
MAI Gateway(魔芋企业级AI网关)功能全解:AI网关有哪些功能?一文看懂AI网关能力矩阵
大数据·人工智能·矩阵·gateway·mai gateway·企业级产品
船厂电气自动化ai大模型1 天前
AI大模型与数学 第75课 基、维度、向量空间坐标
数据结构·线性代数·算法·机器学习·推荐算法
hansang_IR2 天前
【题解】P4456 [CQOI2018] 交错序列(矩阵乘法)
c++·线性代数·算法
BSD_HY2 天前
薄膜开关矩阵扫描在低功耗MCU上的GPIO扩展实现
单片机·嵌入式硬件·矩阵·人机交互·薄膜开关·源头工厂
Nil2082 天前
leetcode 74搜索二维矩阵
算法·leetcode·矩阵
小飞象—木兮2 天前
BCG波士顿矩阵深度解析及应用指南:核心逻辑、落地路径、常见误区、案例
大数据·人工智能·矩阵·数据分析·用户运营
浪里镖客2 天前
位姿转换矩阵中旋转与平移转换的问题--解决方案
线性代数·矩阵
hansang_IR3 天前
【题解】P5364 [SNOI2017] 礼物
c++·线性代数·算法
TKcloudmaster_H3 天前
告别低效运营:跨境数据分析 + 多账号矩阵增效方案
大数据·矩阵·数据挖掘·数据分析·新媒体运营·产品运营·流量运营
IT小白杨4 天前
多店铺防关联指纹浏览器哪个好:从账号关联判定模型到环境隔离架构的一次拆解
经验分享·物联网·矩阵·架构·指纹浏览器