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] 来代表网格上从左上角到达每一点的最短路径。同样对第一行和第一列要进行初始化的操作:
- 初始化第一行
for(i=1;i<m;i++) //初始化第一列,注意每一dp为该位置加上上一位置的和
dp[i][0] = grid[i][0]+dp[i-1][0];
- 初始化第一列:
for(j=1;j<n;j++) // 初始化第一列,注意每一dp为该位置加上上一位置的和
dp[0][j] = dp[0][j-1] + grid[0][j];
- 更新其他位置
// 由于回来自左边和上边,所以需要进行比较两个的大小
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 实现起来还是挺简单。