当前位置: 面试刷题>> 不同路径 II(经典算法150题)


题目描述补充

不同路径 II

一个机器人位于一个 m x n 网格的左上角。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角。但是,网格中存在一些障碍物,用 1 表示,机器人不能通过这些障碍物。给定这样的网格,问机器人有多少条不同的路径可以到达右下角?

示例 1:

输入:
[
  [0,0,0],
  [0,1,0],
  [0,0,0]
]
输出: 2
解释:
3x3 网格的正中间有一个障碍物。
从左上角到右下角一共有 2 条不同的路径:
1. 向右 -> 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右 -> 向右

示例 2:

输入:
[
  [0,1],
  [0,0]
]
输出: 1

PHP 示例代码

function uniquePathsWithObstacles($obstacleGrid) {
    $m = count($obstacleGrid);
    $n = count($obstacleGrid[0]);

    // 初始化dp数组
    $dp = array_fill(0, $m, array_fill(0, $n, 0));

    // 起始位置如果无障碍则设为1
    if ($obstacleGrid[0][0] == 0) {
        $dp[0][0] = 1;
    }

    // 第一列初始化
    for ($i = 1; $i < $m; $i++) {
        if ($obstacleGrid[$i][0] == 0) {
            $dp[$i][0] = $dp[$i-1][0];
        }
    }

    // 第一行初始化
    for ($j = 1; $j < $n; $j++) {
        if ($obstacleGrid[0][$j] == 0) {
            $dp[0][$j] = $dp[0][$j-1];
        }
    }

    // 填充dp表
    for ($i = 1; $i < $m; $i++) {
        for ($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];
}

Python 示例代码

def uniquePathsWithObstacles(obstacleGrid):
    m, n = len(obstacleGrid), len(obstacleGrid[0])
    dp = [[0] * n for _ in range(m)]

    # 初始化左上角
    if obstacleGrid[0][0] == 0:
        dp[0][0] = 1

    # 第一行和第一列初始化
    for i in range(1, m):
        if obstacleGrid[i][0] == 0:
            dp[i][0] = dp[i-1][0]
    for j in range(1, n):
        if obstacleGrid[0][j] == 0:
            dp[0][j] = dp[0][j-1]

    # 填充dp表
    for i in range(1, m):
        for j in range(1, n):
            if obstacleGrid[i][j] == 0:
                dp[i][j] = dp[i-1][j] + dp[i][j-1]

    return dp[m-1][n-1]

JavaScript 示例代码

function uniquePathsWithObstacles(obstacleGrid) {
    const m = obstacleGrid.length;
    const n = obstacleGrid[0].length;
    const dp = new Array(m).fill(0).map(() => new Array(n).fill(0));

    // 初始化左上角
    if (obstacleGrid[0][0] === 0) {
        dp[0][0] = 1;
    }

    // 第一行和第一列初始化
    for (let i = 1; i < m; i++) {
        if (obstacleGrid[i][0] === 0) {
            dp[i][0] = dp[i-1][0];
        }
    }
    for (let j = 1; j < n; j++) {
        if (obstacleGrid[0][j] === 0) {
            dp[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];
}

希望这些示例代码能帮助你理解和解答这个问题。在准备面试时,理解和熟练掌握这类动态规划问题是很有帮助的。如果你有任何其他问题,欢迎继续提问。

推荐面试题