Leetcode-63 Unique Paths II

Unique Paths II

A robot is located at the top-left corner of a m x n grid (marked ‘Start’ in the diagram below).

The robot can only move either down or right at any point in time. The robot is trying to reach the bottom-right corner of the grid (marked ‘Finish’ in the diagram below).

Now consider if some obstacles are added to the grids. How many unique paths would there be?

An obstacle and empty space is marked as 1 and 0 respectively in the grid.

Note: m and n will be at most 100.

Example 1

1
2
3
4
5
6
7
8
9
10
11
12
Input:
[
[0,0,0],
[0,1,0],
[0,0,0]
]
Output: 2
Explanation:
There is one obstacle in the middle of the 3x3 grid above.
There are two ways to reach the bottom-right corner:
1. Right -> Right -> Down -> Down
2. Down -> Down -> Right -> Right

解题思路

动态规划。若当前位置是障碍,则到达该位置的路径数为零;否则,路径数=左单元路径数+上单元路径数。

复杂度分析

  • 时间复杂度:$O(mn)$。
  • 空间复杂度:$O(1)$,可直接利用 obstacleGrid

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
int m = obstacleGrid.size(), n = 0;
if (m > 0) n = obstacleGrid[0].size();
if (n == 0) return 0;
if (obstacleGrid[0][0] == 1) return 0;

obstacleGrid[0][0] = 1;
for (int j = 1; j < n; ++j) { //计算到达第一行各单元的路径数
obstacleGrid[0][j] = 1 - obstacleGrid[0][j];
if (obstacleGrid[0][j]) //该单元不是障碍,路径数= 左+上(=0)
obstacleGrid[0][j] = obstacleGrid[0][j - 1];
}
for (int i = 1; i < m; ++i) { //计算到达第一列各单元的路径数
obstacleGrid[i][0] = 1 - obstacleGrid[i][0];
if (obstacleGrid[i][0]) //该单元不是障碍,路径数= 左(=0)+上
obstacleGrid[i][0] = obstacleGrid[i - 1][0];
}

for (int i = 1; i < m; ++i) {
for (int j = 1; j < n; ++j) { //到达其他各单元的路径数
obstacleGrid[i][j] = 1 - obstacleGrid[i][j];
if (obstacleGrid[i][j]) { //该单元不是障碍,路径数= 左+上
unsigned tmp = 0; //防止路径数超过int范围
tmp = tmp + obstacleGrid[i - 1][j] + obstacleGrid[i][j - 1];
obstacleGrid[i][j] = int(tmp);
}
}
}
return obstacleGrid[m - 1][n - 1];
}
};