动态规划
右下角的最小路径 = min(上方最小路径 + 右下角,左边最小路径 + 右下角)
00位置的最小路径 = gird[0][0]
01位置的最小路径 = grid[0][0] + grid[0][1]。
……
11位置的最小路径 = min(01,10) + grid[1][1]
……
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
int m = grid.size(), n = grid[0].size();
if(!m) return -1;
vector<vector<int>> dp(m, vector<int>(n));//默认m*n初始值为0的二维数组
dp[0][0] = grid[0][0];
for(int i=1; i<m; ++i){
dp[i][0] = dp[i-1][0] + grid[i][0];
}
for(int j=1; j<n; ++j){
dp[0][j] = dp[0][j-1] + grid[0][j];
}
for(int i=1; i<m; ++i){
for(int j=1; j<n; ++j){
if(dp[i-1][j] < dp[i][j-1])
dp[i][j] = dp[i-1][j] + grid[i][j];
else
dp[i][j] = dp[i][j-1] + grid[i][j];
}
}
return dp[m-1][n-1];
}
};
时间复杂度:
O
(
m
n
)
O(mn)
O(mn),遍历整个
m
×
n
m \times n
m×n网格
空间复杂度:
O
(
m
n
)
O(mn)
O(mn),另需
m
×
n
m \times n
m×n大小数组存储网格中每个位置的最小路径。空间复杂度优化:1. 存储上一行;2. 原地修改。
注意
-
最后返回的是
dp[m-1][n-1]
,dp[m][n]
越界访问 -
二维数组的初始化,
vector<vector<int>> dp(m, vector<int>(n))
,不是vector<vector<int>> dp(m,n)
。