解题思路

与LC62大致相似,多了一个路障,遇到路障时候跳过,若上i - 1或者j - 1是路障则不添加路线

首先dp[i][j]肯定是能到这个位置的所有路径

递推公式:dp[i][j] = dp[i - 1][j] + dp[i][j - 1]

初始化:dp[i][j] = 0

遍历顺序:顺序遍历

代码

Python

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution:
def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:
m = len(obstacleGrid)
n = len(obstacleGrid[0])
if obstacleGrid[0][0] == 1: return 0
dp = [[0] * n for _ in range(m)]
dp[0][0] = 1
for i in range(m):
for j in range(n):
if obstacleGrid[i][j] == 1: continue
if i - 1 >= 0 and obstacleGrid[i - 1][j] != 1:
dp[i][j] += dp[i - 1][j]
if j - 1 >= 0 and obstacleGrid[i][j - 1] != 1:
dp[i][j] += dp[i][j - 1]
return dp[m - 1][n - 1]

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
int m = obstacleGrid.size(), n = obstacleGrid[0].size();
vector<vector<int>> dp(m, vector<int>(n, 0));
if (obstacleGrid[0][0] == 1) return 0;
dp[0][0] = 1;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (obstacleGrid[i][j] == 1) continue;
if (i - 1 >= 0 && obstacleGrid[i - 1][j] != 1) dp[i][j] += dp[i - 1][j];
if (j - 1 >= 0 && obstacleGrid[i][j - 1] != 1) dp[i][j] += dp[i][j - 1];
}
}
return dp[m - 1][n - 1];
}
};

Go

func uniquePathsWithObstacles(obstacleGrid [][]int) int {
    m, n := len(obstacleGrid), len(obstacleGrid[0])
    dp := make([][]int, m)
    for i := range dp {
        dp[i] = make([]int, n)
    }
    if obstacleGrid[0][0] == 1 {return 0}
    dp[0][0] = 1
    for i := 0; i < m; i++ {
        for j := 0; j < n; j++ {
            if obstacleGrid[i][j] == 1 {continue}
            if i - 1 >= 0 && obstacleGrid[i - 1][j] != 1 {
                dp[i][j] += dp[i - 1][j]
            }
            if j - 1 >= 0 && obstacleGrid[i][j - 1] != 1 {
                dp[i][j] += dp[i][j - 1]
            }
        }
    }
    return dp[m - 1][n - 1]
}