牛客热题:矩阵的最小路径和

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

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

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

文章目录

牛客热题:矩阵的最小路径和

题目链接

矩阵的最小路径和_牛客题霸_牛客网 (nowcoder.com)

方法一:二维dp

思路

①状态表示:

​ d p [ i ] [ j ] dp[i][j] dp[i][j] 表示为从起点(0, 0)到(i, j)位置的最小路径和

②初始化:

​ 首先对于第一行第一列来说,他们的路径都只有一条,就是从他们的上方或者左方到达,因此我们可以直接计算出他们的路径和。

③状态转移方程:

​ 对于每一个位置来说,有两个路径来源,我们选取路径和小的就可以。

​ d p [ i ] [ j ] = m i n ( d p [ i − 1 ] [ j ] , d p [ i ] [ j − 1 ] ) + m a t r i x [ i ] [ j ] dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + matrix[i][j] dp[i][j]=min(dp[i−1][j],dp[i][j−1])+matrix[i][j]

④填表顺序:

​ 我们发现当前位置状态的获取都需要依赖上方和左方位置的状态,因此我们填表顺序为:

从上到下,从左到右。

⑤返回结果:

​ 因为答案要求的是从起点到终点的最小路径和,因此我们要返回的结果就是 d p [ m − 1 ] [ n − 1 ] dp[m - 1][n - 1] dp[m−1][n−1]

代码

cpp 复制代码
int minPathSum(vector<vector<int> >& matrix) 
    {
        int m = matrix.size();
        int n = matrix[0].size();
        vector<vector<int>> dp(m, vector<int>(n, 0));
        //初始化
        dp[0][0] = matrix[0][0];
        for(int i = 1; i < m || i < n; ++i)
        {
            if(i < m) dp[i][0] = dp[i - 1][0] + matrix[i][0];
            if(i < n) dp[0][i] = dp[0][i - 1] + matrix[0][i];
        }

        for(int i = 1; i < m; ++i)
            for(int j = 1; j < n; ++j)
            {
                dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + matrix[i][j];
            }
        return dp[m - 1][n - 1];
    }

复杂度

时间复杂度:遍历了一次二维dp数组: O ( m ∗ n ) O(m * n) O(m∗n)

空间复杂度:使用了额外的二维数组: O ( m ∗ n ) O(m * n) O(m∗n)

相关推荐
聆风吟º1 小时前
【数据结构入门手札】算法核心概念与复杂度入门
数据结构·算法·复杂度·算法的特性·算法设计要求·事后统计方法·事前分析估算方法
vir022 小时前
密码脱落(最长回文子序列)
数据结构·c++·算法
福尔摩斯张2 小时前
二维数组详解:定义、初始化与实战
linux·开发语言·数据结构·c++·算法·排序算法
Samuel-Gyx2 小时前
数据结构--二叉树构造与遍历顺序的相互转化
数据结构
未若君雅裁2 小时前
斐波那契数列 - 动态规划实现 详解笔记
java·数据结构·笔记·算法·动态规划·代理模式
晨非辰6 小时前
数据结构排序系列指南:从O(n²)到O(n),计数排序如何实现线性时间复杂度
运维·数据结构·c++·人工智能·后端·深度学习·排序算法
星期天210 小时前
3.0 C语⾔内存函数:memcpy memmove memset memcmp 数据在内存中的存储:整数在内存中的存储 ⼤⼩端字节序和字节序判断
c语言·数据结构·进阶·内存函数·数据内存存储
fashion 道格14 小时前
用 C 语言玩转归并排序:递归实现的深度解析
数据结构·算法·排序算法
j_xxx404_14 小时前
C++:继承(概念及定义|作用域|基类与派生类转换|默认成员函数|与友元、静态成员关系|多继承|组合)
数据结构·c++
码银14 小时前
【数据结构】 栈和队列
数据结构