学习时间:2022-10-4
学习内容
64. 最小路径和
思路
使用动态规划,还算简单,dp的长度还可以再优化
代码
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 i = 1;i<m;i++){
dp[i][0] = dp[i-1][0] + grid[i][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++){
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];
}
}
更优解
也是动态规划
63. 不同路径 II
思路
如果有石头,则将dp置为0,对于初始化的元素,如果放了石头,还需要检查是否前面元素也是0,如果是则后面全部置为0
代码
class Solution {
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
int m = obstacleGrid.length;
int n = obstacleGrid[0].length;
int[][] dp = new int[m][n];
dp[0][0] = obstacleGrid[0][0] == 1?0:1;
for(int i = 1;i<m;i++){
dp[i][0] = obstacleGrid[i][0] == 1? 0: 1;
if(dp[i-1][0] == 0) dp[i][0] = 0;
}
for(int i = 1;i<n;i++){
dp[0][i] = obstacleGrid[0][i] == 1? 0: 1;
if(dp[0][i-1] == 0) dp[0][i] = 0;
}
for(int i = 1;i<m;i++){
for(int j = 1;j<n;j++){
dp[i][j] = dp[i-1][j] + dp[i][j-1];
if(obstacleGrid[i][j] == 1) dp[i][j] = 0;
}
}
return dp[m-1][n-1];
}
}