学习记录:js算法(一百二十三):不同路径 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。

  1. 初始化 dp 数组:创建一个与给定网格大小相同的二维数组 dp,并将所有值初始化为 0。
  2. 边界条件:将 dp[0][0] 设置为 1,表示起点有 1 条路径。
  3. 填充 dp 数组:从第一行和第一列开始,逐步填充 dp 数组。对于每个格子 (i, j),如果该格子不是障碍物,则 dp[i][j] 的值等于左边格子 dp[i][j-1] 和上边格子 dp[i-1][j] 的路径数量之和。
  4. 处理障碍物:如果某个格子是障碍物,则将其对应的 dp 数组中的值设为 0。
  5. 返回结果:最后,dp[m-1][n-1] 的值就是从起点到终点的不同路径数量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值