终身役役而不见其成功,苶然疲役而不知其所归
1.题目
2.动态规划
2.1 分析
状态转移方程:
dp[i][j]=min(dp[i-1][j],dp[i][j-1])+grid[i][j]。
初始条件:
dp[0][0]=grid[0][0];
dp[■][0]=dp[■-1][0]+grid[■][0];
dp[0][■]=dp[0][■-1]+grid[0][■]
返回值:
dp[m-1][n-1]
2.2 代码
class Solution {
public int minPathSum(int[][] grid) {
int m=grid.length;
int n=grid[0].length;
int[][] dp=new int[m][n];
dp[0][0]=grid[0][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++){
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]=Math.min(dp[i-1][j],dp[i][j-1])+grid[i][j];
}
}
return dp[m-1][n-1];
}
}
2.3 复杂度
时间复杂度O(MN)
空间复杂度O(MN)
2.4 结果
3.空间优化
3.1 分析
使用原数组
3.2 代码
class Solution {
public int minPathSum(int[][] grid) {
int m=grid.length;
int n=grid[0].length;
for(int j=1;j<n;j++){
grid[0][j]=grid[0][j-1]+grid[0][j];
}
for(int i=1;i<m;i++){
grid[i][0]=grid[i-1][0]+grid[i][0];
}
for(int i=1;i<m;i++){
for(int j=1;j<n;j++){
grid[i][j]=Math.min(grid[i-1][j],grid[i][j-1])+grid[i][j];
}
}
return grid[m-1][n-1];
}
}
3.3 复杂度
空间复杂度O(1)