【刷题日记】64. 最小路径和

简介: 本次刷题日记的第 39 篇,力扣题为:64. 最小路径和 ,中等

【刷题日记】64. 最小路径和

本次刷题日记的第 39 篇,力扣题为:64. 最小路径和中等

一、题目描述:

image.png

又是一个最小路径和,还记得前面一次我们做的 120. 三角形最小路径和 吗,咱们这一次的思路是不是和上一次一样呢?

是否也可以按照题目要求,找到一些规律,来进行数学运算呢?可以来瞅瞅


二、这道题考察了什么思想?你的思路是什么?

仔细查看一下这个题给出我们的重点信息有哪些:

  • 题目中给出了咱们一个表格,每个表格上面会有对应的整数,数字没有规律
  • 我们需要从左上角走路到右下角,需要路径和是最小的,题目明确要求,我们只能向右或者向下走,是不能蛇形走位的哦

细心的我们可以发现,整个表格,如果是按照第一行往右走,那么影响因素只有左边这一个,同理,第一列的时候,一直往下走,那么影响因素只有上面一个

就比如说 例子中,3 这个格子,肯定是从 左上角的 1 这个格子走过来的,同理,右上角的这个格子,肯定也是 3 这个格子走过来的

image.png

那么除了第一行和第一列,其他的格子是不是也会那么纯粹呢?

例如 5 这个格子,可能是上面的 3 这个格子走下来的,也有可能是左边的 1 这个格子向右走过来的,那么到底是谁走过来的路径是最小的呢?

当然这就依赖于他们之前的路径和是否是最小的了,因为我们就可以这样来推演,如下:

image.png

我们创建一个和题目给出的表格一样的二维数组,主要是记录最小路径和

第一行,和第一列,还是刚才说的一样,按照既定的路径和方式进行偏移和计算,当我们计算到其他格子的时候,就需要考虑当前格子,从左边走过来,和从上面走下来,谁路径和最小,谁小,就按照谁的方向来

如上图,这样一来,稍微推演一下,我们的思路就清晰了吧,接下里就开始撸代码吧

三、编码

根据上述逻辑和分析,我们就可以翻译成如下代码,这里需要注意这么几个情况

  • 单独处理好第一行的数据
  • 单独处理好第一列的数据
  • 其他剩下的格子,考虑好他的上方和左方的数据,计算最小路径和
func minPathSum(grid [][]int) int {
    //  校验输入的 grid 是不是表格
    if len(grid) == 0 || len(grid[0]) == 0 {
        return 0
    }
    // 给 dp 分配好空间,与题目给出的 grid 表格保持同样的空间
    row,col := len(grid), len(grid[0])
    dp := make([][]int, row)
    for i := 0; i< row ; i++{
        dp[i] = make([]int,col)
    }
    dp[0][0] = grid[0][0]
    // 计算,第一行
    for j:=1; j<col; j++{
        dp[0][j] = dp[0][j-1] +grid[0][j]
    }
    // 计算 第一列
    for i:=1; i<row; i++{
        dp[i][0] = dp[i-1][0] + grid[i][0]
    }
    // 计算剩下的格子
    for i:=1; i<row; i++{
        for j:=1;j<col;j++{
            dp[i][j] = min(dp[i][j-1],dp[i-1][j]) + grid[i][j]
        }
    }
    return dp[row-1][col-1]
}
func min(a,b int)int{
    if a<b{
        return a
    }
    return b
}

按照编码逻辑,和咱们的思路是一毛一样的,我们这样做的原因之一是题目给出的规则,只能往右或者往下,所以当前格子,要么是通过往下走移动到的,或者是往右走移动到的

最终,咱们走到表格的右下角,及计算 ok,得到整个链路的最小路径

四、总结:

按照我们这种方式去实现和解决问题,那么时间复杂度对于此题就很明确了吧,相当于咱们就是遍历了给出表格,每个格子咱们都已经遍历到了,所以时间度是 O(nm),n 可以理解为行,m 可以理解为 列

同理空间复杂度也是 O(nm),因为咱们也同样开辟了和表格一样的二维数组,产生了空间消耗

原题地址:64. 最小路径和

今天就到这里,学习所得,若有偏差,还请斧正

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

image.png

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~



相关文章
|
7月前
|
算法 容器
OJ刷题日记:2、双指针(2)
OJ刷题日记:2、双指针(2)
46 0
|
7月前
OJ刷题日记:3、滑动窗口(1)
OJ刷题日记:3、滑动窗口(1)
63 0
|
7月前
|
容器
《剑指offer》——刷题日记
《剑指offer》——刷题日记
|
7月前
|
算法 测试技术
OJ刷题日记:1、双指针(1)
OJ刷题日记:1、双指针(1)
60 0
|
7月前
|
算法 C++ 索引
OJ刷题日记:4、滑动窗口(2)
OJ刷题日记:4、滑动窗口(2)
69 0
|
Cloud Native
【刷题日记】1184. 公交站间的距离
好久不刷题,没有锻炼思维,感觉脑袋都要生锈了,刷题感觉还是要从简单题刷题才能慢慢找到感觉
|
测试技术 索引 Cloud Native
【刷题日记】120. 三角形最小路径和
本次刷题日记的第 38 篇,力扣题为:120. 三角形最小路径和 ,中等
|
Cloud Native
【刷题日记】70. 爬楼梯
本次刷题日记的第 10 篇,力扣题为:70. 爬楼梯 ,简单
|
算法 测试技术 Cloud Native
【刷题日记】2104. 子数组范围和
对于很久没有刷题的我来说,突然开始也开始刷题了,不为别的,已经习惯参与掘金的活动了,同时也可以促进自己再回顾一下算法题,毕竟长时间不练,真的就生疏了
|
存储 索引 Cloud Native
【刷题日记】498. 对角线遍历
本次刷题日记的第 65 篇,力扣题为:498. 对角线遍历,中等