Leetcode C++《热题 Hot 100-40》64.最小路径和
- 题目
给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
示例:
输入:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
输出: 7
解释: 因为路径 1→3→1→1→1 的总和最小。
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/minimum-path-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
- 思路
- 方案1:可以使用动态规划dp[i][j] = min(dp[i-1][j], dp[i][j-1])+grid[i][j]
- 时间复杂度nn,空间复杂度nn
- 优化:可以优化空间复杂度
- 空间复杂度可以是o(n)只存储一行的数据
- 时间复杂度也可以是o(1)将最小路径和存储在原matrix上
- 代码
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
//方案1:可以使用动态规划dp[i][j] = min(dp[i-1][j], dp[i][j-1])+grid[i][j]
if (grid.size() == 0)
return 0;
vector<vector<int>> dp;
for (int i = 0; i < grid.size(); i++) {
vector<int> oneLineDp;
for (int j = 0; j < grid[0].size(); j++) {
oneLineDp.push_back(0);
}
dp.push_back(oneLineDp);
}
for (int i = 0; i < grid.size(); i++) {
for (int j = 0; j < grid[0].size(); j++) {
int beforeStep = 0;
if (i-1 >= 0 && j-1 >= 0)
beforeStep = min(dp[i-1][j], dp[i][j-1]);
else if (i-1 >= 0 && j-1 < 0)
beforeStep = dp[i-1][j];
else if (i-1 < 0 && j-1 >= 0)
beforeStep = dp[i][j-1];
else
beforeStep = 0;
dp[i][j] = beforeStep + grid[i][j];
}
}
return dp[grid.size()-1][grid[0].size()-1];
}
};