63. Unique Paths II(独特路径 II)
题目大意
You are given an m x n
integer array grid
. There is a robot initially located at the top-left corner (i.e., grid[0][0]
). The robot tries to move to the bottom-right corner (i.e., grid[m - 1][n - 1]
). The robot can only move either down or right at any point in time.
An obstacle and space are marked as 1 or 0 respectively in grid
. A path that the robot takes cannot include any square that is an obstacle.
Return the number of possible unique paths that the robot can take to reach the bottom-right corner.
中文释义
给定一个 m x n
整数数组 grid
。最初有一个机器人位于左上角(即 grid[0][0]
)。机器人试图移动到右下角(即 grid[m - 1][n - 1]
)。机器人在任何时候只能向下或向右移动。
grid
中的障碍物和空地分别标记为 1 和 0。机器人走的路径不能包括任何障碍物。
返回机器人到达右下角的可能独特路径数。
示例
-
示例 1:
- 输入:
obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]
- 输出:
2
- 解释:中间的 3x3 网格上有一个障碍物。
到达右下角有两种方式:- 右 -> 右 -> 下 -> 下
- 下 -> 下 -> 右 -> 右
- 输入:
-
示例 2:
- 输入:
obstacleGrid = [[0,1],[0,0]]
- 输出:
1
- 输入:
限制条件
m == obstacleGrid.length
n == obstacleGrid[i].length
1 <= m, n <= 100
obstacleGrid[i][j]
为 0 或 1。
解题思路
使用动态规划(DP)来解决问题。创建一个二维 dp
数组来存储到达每个位置的路径数,考虑障碍物的影响。
步骤说明
- 初始化一个与网格同样大小的
dp
数组,其中dp[i][j]
表示到达位置(i, j)
的路径数。 - 遍历网格的每一个位置:
- 如果位置上有障碍物,则跳过。
- 计算从上方和左侧来的路径数,并更新
dp[i][j]
。
dp
数组的最后一个元素即为到达右下角的路径数。
代码
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
int n = obstacleGrid.size(), m = obstacleGrid[0].size();
vector<vector<int>> dp(n, vector<int>(m, 0));
dp[0][0] = obstacleGrid[0][0] == 0 ? 1 : 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (i == 0 && j == 0 || obstacleGrid[i][j] == 1) continue;
int up_paths = 0, left_paths = 0;
if (i - 1 >= 0) up_paths = dp[i - 1][j];
if (j - 1 >= 0) left_paths = dp[i][j - 1];
dp[i][j] = up_paths + left_paths;
}
}
return dp[n - 1][m - 1];
}
};