题目
题目描述
给定一个 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 条不同的路径:
- 向右 -> 向右 -> 向下 -> 向下
- 向下 -> 向下 -> 向右 -> 向右
示例 2:
输入:obstacleGrid = [[0,1],[0,0]]
输出:1
提示:
m == obstacleGrid.length
n == obstacleGrid[i].length
1 <= m, n <= 100
obstacleGrid[i][j] 为 0 或 1
题解
思路分析
这个问题可以通过动态规划来解决。我们可以定义 dp[i][j]
表示从起点到达位置 (i, j)
的不同路径数量。为了处理障碍物,我们需要对初始化和状态转移进行调整:
-
初始化:
- 如果起点有障碍物,则直接返回
0
。 - 初始化第一行和第一列时,如果遇到障碍物,则后续的所有单元格都无法到达,设为
0
。
- 如果起点有障碍物,则直接返回
-
状态转移:
- 对于其他位置
(i, j)
,如果当前位置没有障碍物,则dp[i][j] = dp[i-1][j] + dp[i][j-1]
;否则,dp[i][j] = 0
。
- 对于其他位置
最终结果为 dp[m-1][n-1]
。
Python 实现代码
def uniquePathsWithObstacles(obstacleGrid: List[List[int]<