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

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

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

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

文章目录

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

题目链接

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

相关推荐
老歌老听老掉牙13 小时前
平面旋转与交线投影夹角计算
python·线性代数·平面·sympy
呵呵哒( ̄▽ ̄)"17 小时前
线性代数:公共解
线性代数
呵呵哒( ̄▽ ̄)"18 小时前
线性代数:同解(1)
python·线性代数·机器学习
SweetCode18 小时前
裴蜀定理:整数解的奥秘
数据结构·python·线性代数·算法·机器学习
程序员Linc18 小时前
写给新人的深度学习扫盲贴:向量与矩阵
人工智能·深度学习·矩阵·向量
SylviaW082 天前
python-leetcode 63.搜索二维矩阵
python·leetcode·矩阵
小卡皮巴拉2 天前
【力扣刷题实战】矩阵区域和
开发语言·c++·算法·leetcode·前缀和·矩阵
闯闯爱编程2 天前
数组与特殊压缩矩阵
数据结构·算法·矩阵
ElseWhereR2 天前
矩阵对角线元素的和 - 简单
线性代数·矩阵
飞川撸码2 天前
【LeetCode 热题100】240:搜索二维矩阵 II(详细解析)(Go语言版)
leetcode·矩阵·golang