LeetCode-64. 最小路径和

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

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

文章目录

  • LeetCode-64. 最小路径和 (中等)
  • 1. 题目描述及示例
      • 示例一
      • 示例二
  • 2. 题解和代码实现
      • 代码实现(C++ 2022-3-26)
  • 3. 总结

1. 题目描述及示例

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

示例一

LeetCode-64. 最小路径和_第1张图片

输入: 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 实现起来还是挺简单。

你可能感兴趣的:(leetcode,热题,HOT,100,#,贪心算法,leetcode,算法,职场和发展,动态规划,游戏)