文章目录
- 不同路径 II
- 思路一
不同路径 II
给定一个 m x n 的整数数组 grid。一个机器人初始位于 左上角(即 grid[0][0])。机器人尝试移动到 右下角(即 grid[m - 1][n - 1])。机器人每次只能向下或者向右移动一步。
网格中的障碍物和空位置分别用 1 和 0 来表示。机器人的移动路径中不能包含 任何 有障碍物的方格。
返回机器人能够到达右下角的不同路径数量。
测试用例保证答案小于等于 2 * 109。
图一:
图二:
示例 1:图一
输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]
输出:2
解释:3x3 网格的正中间有一个障碍物。
从左上角到右下角一共有 2 条不同的路径:
1. 向右 -> 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右 -> 向右
示例 2:图二
输入:obstacleGrid = [[0,1],[0,0]]
输出:1
思路一
function uniquePathsWithObstacles(obstacleGrid) {
const m = obstacleGrid.length;
const n = obstacleGrid[0].length;
const dp = Array.from({ length: m }, () => Array(n).fill(0));
// 初始化 dp 数组的第一行和第一列
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;
}
// 填充 dp 数组
for (let i = 1; i < m; i++) {
for (let j = 1; j < n; j++) {
if (obstacleGrid[i][j] === 0) {
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
}
}
}
return dp[m - 1][n - 1];
}
讲解
我们需要计算从起点到终点的不同路径数量,同时需要避开障碍物。基本思路是使用一个二维数组 dp 来存储从起点到每个格子的不同路径数量。为了避免障碍物,当遇到障碍物时,我们将该格子的路径数量设为 0。
- 初始化 dp 数组:创建一个与给定网格大小相同的二维数组 dp,并将所有值初始化为 0。
- 边界条件:将 dp[0][0] 设置为 1,表示起点有 1 条路径。
- 填充 dp 数组:从第一行和第一列开始,逐步填充 dp 数组。对于每个格子 (i, j),如果该格子不是障碍物,则 dp[i][j] 的值等于左边格子 dp[i][j-1] 和上边格子 dp[i-1][j] 的路径数量之和。
- 处理障碍物:如果某个格子是障碍物,则将其对应的 dp 数组中的值设为 0。
- 返回结果:最后,dp[m-1][n-1] 的值就是从起点到终点的不同路径数量。