题一:不同路径
题目链接: 不同路径
解题思路: dp[i][j]代表在位置(i,j)时候的路径总数,dp[i][j] = dp[i-1][j] + dp[i][j-1]; dp[0][i] = 1; dp[i][0] = 1; 从左到右,由上至下进行遍历。
解题代码:
var uniquePaths = function (m, n) {
// dp[i][j] 到达位置(i,j)的所有路径数量
// dp[i][j] = dp[i-1][j] + dp[i][j-1]
// dp[0][j] = 1; dp[i][0] = 1;
let dp = new Array(m).fill(0).map(v => new Array(n).fill(0));
for (let i = 0; i < m; i++)dp[i][0] = 1;
for (let i = 0; i < n; i++)dp[0][i] = 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];
};
题二:不同路径 II
题目链接: 不同路径II
解题思路: 障碍处肯定是不能走的,在边界上遇到障碍时,那一行或者是那一列障碍物后边位置都为0,都不可以走。dp[i][j]所代表的含义不变,初始化行列的时候要注意判断障碍物。递推公式不变,当遍历非上左边界的时候要注意,遇到障碍物 dp[i][j]= 0;
解题代码:
var uniquePathsWithObstacles = function (obstacleGrid) {
let m = obstacleGrid.length;
let n = obstacleGrid[0].length;
if (obstacleGrid[0][0] === 1 || obstacleGrid[m - 1][n - 1] === 1) return 0;
let dp = new Array(m).fill(0).map(v => new Array(n).fill(0));
for (let i = 0; i < m && obstacleGrid[i][0] === 0; i++) {
dp[i][0] = 1;
}
for (let i = 0; i < n && obstacleGrid[0][i] === 0; i++) {
dp[0][i] = 1;
}
for (let i = 1; i < m; i++) {
for (let j = 1; j < n; j++) {
if (obstacleGrid[i][j] === 1) {
dp[i][j] = 0;
} else {
dp[i][j] = dp[i - 1][j] + dp[i][j-1];
}
}
}
return dp[m-1][n-1];
};
275

被折叠的 条评论
为什么被折叠?



