Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path.
利用动态规划
解法一:时间复杂度和空间赋值为O(m*n)
class Solution {
public:
int minPathSum(vector<vector<int>> &grid) {
int m = grid.size(), n = grid[0].size();
vector<vector<int> > dp(m,vector<int>(n));
for(int i = 0; i < m; ++i){
for(int j = 0;j < n; ++j){
if(i == 0){
if(j == 0){
dp[i][j] = grid[i][j];
}else{
dp[i][j] = dp[i][j-1] + grid[i][j];
}
}else if(j == 0){
dp[i][j] = dp[i-1][j] + grid[i][j];
}else{
dp[i][j] = min(dp[i][j-1],dp[i-1][j]) + grid[i][j];
}
}
}
return dp[m-1][n-1];
}
};
解法2 空间优化--空间复杂度为O(n)
dp[i][j]只与dp[i-1][j],dp[i][j-1]有关,对每个正向循环j,之前的dp[j-1]是“新的”,dp[j]还是旧的
dp[j]=min(dp[j-1],dp[j])+a[i][j]更新
class Solution {
public:
int minPathSum(vector<vector<int>> &grid) {
int m = grid.size(), n = grid[0].size();
vector<int> dp(n);
for(int i = 0; i < m; ++i){
for(int j = 0;j < n; ++j){
if(i == 0){
if(j == 0){
dp[j] = grid[i][j];
}else{
dp[j] = dp[j-1] + grid[i][j];
}
}else if(j == 0){
dp[j] = dp[j] + grid[i][j];
}else{
dp[j] = min(dp[j-1],dp[j]) + grid[i][j];
}
}
}
return dp[n-1];
}
};