题目一 62. 不同路径
思路
- dp[i][j]: 代表从dp[0][0]出发到该节点的路径总数
- 初始化:第一行,第一列都只有一种方案,不停的向右或者向下走,所以初始化为第一行第一列都是1
- 递推公式:dp[i][j] = dp[i-1][j] + dp[i][j-1]
- 循环顺序:二维数组循环遍历,从1开始
var uniquePaths = function(m, n) {
const dp = new Array(m).fill(0).map(item => new Array(n).fill(0));
for (let j = 0; j < n; j++) {
dp[0][j] = 1;
}
for (let i = 0; i < m; i++) {
dp[i][0] = 1;
}
for (let i = 1; i < m; i++) {
for (let j = 1; j < n; j++) {
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
}
}
return dp[m - 1][n - 1];
};
题目二 63. 不同路径 II
思路
和上一题类似,但是本题增加的条件是,有障碍物,所以要处理有障碍物的情况
- 二维数组都初始化为0
- dp[i][j]: 代表从dp[0][0]出发到该节点的路径总数
- 初始化:第一行,第一列,不停的向右或者向下走,正常的话是1种方案,但是因为可能遇到障碍物,如果遇到障碍物会导致无法到达后续的格子,所以变为障碍物前面都是可以到达的,且一种方案,障碍物后面的不可到达为0
- 递推公式:如果不是障碍物的情况下才有这个递推公式,障碍物需要跳过 dp[i][j] = dp[i-1][j] + dp[i][j-1]
- 循环顺序:二维数组循环遍历,从1开始
var uniquePathsWithObstacles = function(obstacleGrid) {
const m = obstacleGrid.length;
const n = obstacleGrid[0].length;
const dp = new Array(m).fill(0).map(item => new Array(n).fill(0));
// 初始化
for (let i = 0; i < m && obstacleGrid[i][0] == 0; i++) {
dp[i][0] = 1;
}
for (let j = 0; j < n && obstacleGrid[0][j] == 0; j++) {
dp[0][j] = 1;
}
for (let i = 1; i < m; i++) {
for (let j = 1; j < n; j++) {
if (obstacleGrid[i][j] !== 1) {
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
}
}
}
return dp[m-1][n-1];
};