1.动态规划
对于(i,j),其入口只有(i-1,j)和(i,j-1)两个,故到达(i,j)的最小路径为min(dp[i-1][j],dp[i][j-1])+(i,j)
故状态转移方程为:
dp[i][j]=min(dp[i-1][j],dp[i][j-1])+(i,j),
但需要注意初始化
对于上边界,其路径只能来自于左边
对于左边界,其路径只能来自于上边
代码如下:
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
int m=grid.size();
int n=grid[0].size();
vector<vector<int>>dp(m,vector<int>(n,0));
//初始化
dp[0][0]=grid[0][0];
//上边界
for(int i=1;i<n;i++)
dp[0][i]=dp[0][i-1]+grid[0][i];
//左边界
for(int i=1;i<m;i++)
dp[i][0]=dp[i-1][0]+grid[i][0];
for(int i=1;i<m;i++)
for(int j=1;j<n;j++)
dp[i][j]=min(dp[i-1][j],dp[i][j-1])+grid[i][j];
return dp[m-1][n-1];
}
};
时间复杂度为O(m*n),空间复杂度为O(m*n)
此外,可以让grid数组代替dp数组,这样空间复杂度为O(1)
扫描二维码关注公众号,回复:
9870107 查看本文章