代码随想录算法训练营第39天
今日任务
● 62.不同路径 ● 63. 不同路径 II
链接:https://docs.qq.com/doc/DUE55cVJ5WkNoREhS (opens in a new tab)
62.不同路径
自己想法
dp[i][j]表示到达(i, j)的路径数。 m*n的棋盘格下标从(0, 0)到(m-1, n-1)。
我这里只初始化了dp[0][0] = 1,dp[0][1] = 1,dp[1][0] = 1, 然后循环时,如果i和j都不为0,那么dp[i][j] = dp[i-1][j] + dp[i][j-1]。
但也可以把第一行和第一列都初始化,这样循环时就不用判断i和j是否为0了, 即dp[i][0] = 1,dp[0][j] = 1。
class Solution {
public int uniquePaths(int m, int n) {
// 这里数组大小定义为m+1,n+1是为了初始化不越界,实际循环时不会走到下标为m和n处
int[][] dp = new int[m + 1][n + 1];
dp[0][0] = 1;
dp[0][1] = 1;
dp[1][0] = 1;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (i + j <= 1) continue;
dp[i][j] = 0;
if (i != 0) dp[i][j] += dp[i - 1][j];
if (j != 0) dp[i][j] += dp[i][j - 1];
}
}
return dp[m - 1][n - 1];
}
}63. 不同路径 II
自己想法
将第一行和第一列都初始化,但需要注意有了障碍之后,障碍之后(包括障碍)都是走不到的位置了,所以障碍之后的dp应该还是初始值0。
class Solution {
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
int m = obstacleGrid.length;
int n = obstacleGrid[0].length;
int[][] dp = new int[m][n];
for (int i = 0; i < m; i++) {
if (obstacleGrid[i][0] == 1) break;
else dp[i][0] = 1;
}
for (int j = 0; j < n; j++) {
if (obstacleGrid[0][j] == 1) break;
else dp[0][j] = 1;
}
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
dp[i][j] = 0;
if (obstacleGrid[i][j] == 1) continue;
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
}
}
return dp[m - 1][n - 1];
}
}