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.
The testcases are generated so that the answer will be less than or equal to 2 * (10^9).
Example 1:
Input: obstacleGrid = [[0,0,0],[0,0,0],[0,1,0]]
Output: 3Explanation: There are three ways to reach the bottom-right corner:
Example 2:
Input: obstacleGrid = [[0,0,0],[0,0,1],[0,1,0]]
Output: 0Constraints:
m == obstacleGrid.lengthn == obstacleGrid[i].length1 <= m, n <= 100obstacleGrid[i][j] is 0 or 1.class Solution:
def uniquePathsWithObstacles(self, grid: List[List[int]]) -> int:
M, N = len(grid), len(grid[0])
dp = {(M - 1, N - 1): 1}
def dfs(r, c):
if r == M or c == N or grid[r][c]:
return 0
if (r, c) in dp:
return dp[(r, c)]
dp[(r, c)] = dfs(r + 1, c) + dfs(r, c + 1)
return dp[(r, c)]
return dfs(0, 0)Where is the number of rows and is the number of columns.
class Solution:
def uniquePathsWithObstacles(self, grid: List[List[int]]) -> int:
M, N = len(grid), len(grid[0])
if grid[0][0] == 1 or grid[M - 1][N - 1] == 1:
return 0
dp = [[0] * (N + 1) for _ in range(M + 1)]
dp[M - 1][N - 1] = 1
for r in range(M - 1, -1, -1):
for c in range(N - 1, -1, -1):
if grid[r][c] == 1:
dp[r][c] = 0
else:
dp[r][c] += dp[r + 1][c]
dp[r][c] += dp[r][c + 1]
return dp[0][0]Where is the number of rows and is the number of columns.
class Solution:
def uniquePathsWithObstacles(self, grid: List[List[int]]) -> int:
M, N = len(grid), len(grid[0])
dp = [0] * (N + 1)
dp[N - 1] = 1
for r in range(M - 1, -1, -1):
for c in range(N - 1, -1, -1):
if grid[r][c]:
dp[c] = 0
else:
dp[c] += dp[c + 1]
return dp[0]Where is the number of rows and is the number of columns.
class Solution:
def uniquePathsWithObstacles(self, grid: List[List[int]]) -> int:
M, N = len(grid), len(grid[0])
if grid[0][0] == 1 or grid[M - 1][N - 1] == 1:
return 0
grid[M - 1][N - 1] = 1
for r in range(M - 1, -1, -1):
for c in range(N - 1, -1, -1):
if r == M - 1 and c == N - 1:
continue
if grid[r][c] == 1:
grid[r][c] = 0
else:
down = grid[r + 1][c] if r + 1 < M else 0
right = grid[r][c + 1] if c + 1 < N else 0
grid[r][c] = down + right
return grid[0][0]Where is the number of rows and is the number of columns.