最短路径算法

举报
Linux猿 发表于 2021/12/05 22:12:08 2021/12/05
【摘要】 CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、面试、刷题、算法尽管咨询我,关注我,有问题私聊! 欢迎小伙伴们点赞👍、收藏⭐、留言💬


🎈 作者:Linux猿

🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、面试、刷题、算法尽管咨询我,关注我,有问题私聊!

🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬


本题是一道简单的动态规划题目,下面来一起看一下!

一、题目描述

给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步。

约束条件:

m == grid.length

n == grid[i].length

1 <= m, n <= 200

0 <= grid[i][j] <= 100

二、测试样例

输入:grid = [[1,3,1],[1,5,1],[4,2,1]]

输出:7

其中,grid 的网格如下所示:

说明:在上图中,使用颜色标明的路径 1→3→1→1→1 的总和最小。

三、算法思想

本题是一个简单的动态规划题目,可以使用如下的动态方程:

上面公式的含义是:到达方格 (i, j) 的位置的最小和,必定是从 (i-1, j) 或 (i, j-1)而来,当然,(0, 0)点是起点除外。如下图所示:

图2.png

 其中, 当 i = 0 或 j = 0 的时候需要特殊处理,在上图中是第一列和第一行。

四、代码实现

下面是代码实现,如下所示:

class Solution {
public:
    int minPathSum(vector<vector<int>>& grid) {
        for(int i = 0; i < grid.size(); ++i) {
            for(int j = 0; j < grid[i].size(); ++j) {
                if(i == 0 && i == j)
                    continue;
                int Min = 0x3f3f3f3f;
                if(j-1 >= 0) {
                    Min = min(Min, grid[i][j-1]);
                } 
                if(i-1 >= 0) {
                    Min = min(Min, grid[i-1][j]);
                }
                grid[i][j] += Min;
            }
        }
        return grid[grid.size()-1][grid[0].size()-1];
    }
};

五、算法复杂度

5.1 时间复杂度

时间复杂度:O(mn),在上述算法中,使用了两层 for 循环,分别是 m 和 n 次遍历,因为是嵌套的 for 循环,故时间复杂度为 O(mn)。

5.2 空间复杂度

空间复杂度:O(1),在上述算法中,仅仅使用到了个别的变量,故空间复杂度为O(1)。

六、总结

动态规划题目重要的是要推到出动态方程动态方程一般是从某一点推出是由哪些状态可以组合而成。


CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、面试、刷题、算法尽管咨询我,关注我,有问题私聊!

欢迎小伙伴们点赞👍、收藏⭐、留言💬


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。