LeetCode-64. 最小路径和

LeetCode-64. 最小路径和 (中等)

题目地址:https://leetcode-cn.com/problems/minimum-path-sum/

1. 题目描述及示例

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

示例一

在这里插入图片描述

输入: grid = [[1,3,1],[1,5,1],[4,2,1]]
输出: 7
解释: 因为路径 1→3→1→1→1 的总和最小。

示例二

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

2. 题解和代码实现

      该题的实现其实可以参照与LeetCode-62.不同路径。不同路径实现的是从左上角到右下角一共有多少条路经,该题进行实现从左上角到右下角所经过的路径总和最小。
      具体实现可以采用贪心的思想。如果每一步所求的都是最短路径那么,到最终所求的肯定也是最短的。定义dp[m][n] 来代表网格上从左上角到达每一点的最短路径。同样对第一行和第一列要进行初始化的操作:

  1. 初始化第一行
 for(i=1;i<m;i++) //初始化第一列,注意每一dp为该位置加上上一位置的和
     dp[i][0] = grid[i][0]+dp[i-1][0];
  1. 初始化第一列:
 for(j=1;j<n;j++) // 初始化第一列,注意每一dp为该位置加上上一位置的和
     dp[0][j] = dp[0][j-1] + grid[0][j];
  1. 更新其他位置
  // 由于回来自左边和上边,所以需要进行比较两个的大小
  dp[i][j] = min(dp[i-1][j]+grid[i][j],dp[i][j-1]+grid[i][j]);

代码实现(C++ 2022-3-26)

class Solution {
public:
    int minPathSum(vector<vector<int>>& grid) {
        // 从左上角到右下角的最小路径和
        // 其实我们找到每一个位置的最小值就可以,一直到最后,既?     //  可以是贪心也可以是dp
        int m = grid.size(),n = grid[0].size();
        int i,j,dp[m][n];
        dp[0][0] = grid[0][0];
        for(i=1;i<m;i++) //初始化第一列,注意每一dp为该位置加上上一位置的和
            dp[i][0] = grid[i][0]+dp[i-1][0];
        for(j=1;j<n;j++)
            dp[0][j] = dp[0][j-1] + grid[0][j];
        for(i=1;i<m;i++){
            for(j=1;j<n;j++){
                // 由于回来自左边和上边,所以需要进行比较两个的大小
                dp[i][j] = min(dp[i-1][j]+grid[i][j],dp[i][j-1]+grid[i][j]);
            }
        }
        return dp[m-1][n-1];
    }
};

3. 总结

       2022-3-26 实现起来还是挺简单。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zh-yi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值