Follow up for "Unique Paths":
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.
For example,
There is one obstacle in the middle of a 3x3 grid as illustrated below.
[ [0,0,0], [0,1,0], [0,0,0] ]
The total number of unique paths is 2
.
Unique Paths的扩展题,只不过这题增加了障碍物,还是用动态规划,初始化第一行和第一列时遇到障碍物就停止, 因为障碍物之后的位置肯定到达不了;递推公式是如果grid[i][j]没有障碍物, dp[i][j] = dp[i-1][j] + dp[i][j-1], 如果grid[i][j]有障碍物, dp[i][j] = 0~
class Solution:
# @param obstacleGrid, a list of lists of integers
# @return an integer
def uniquePathsWithObstacles(self, obstacleGrid):
if obstacleGrid is None or len(obstacleGrid) == 0 or len(obstacleGrid[0]) == 0: return 0
lenRow, lenCol = len(obstacleGrid), len(obstacleGrid[0])
dp = [[0 for j in xrange(lenCol)] for i in xrange(lenRow)]
for i in xrange(lenRow):
if obstacleGrid[i][0] == 1:
break
dp[i][0] = 1
for j in xrange(lenCol):
if obstacleGrid[0][j] == 1:
break
dp[0][j] = 1
for i in xrange(1, lenRow):
for j in xrange(1, lenCol):
dp[i][j] = 0 if obstacleGrid[i][j] == 1 else dp[i - 1][j] + dp[i][j - 1]
return dp[lenRow - 1][lenCol - 1]
还有一维动态规划的解法,代码如下~
class Solution:
# @param obstacleGrid, a list of lists of integers
# @return an integer
def uniquePathsWithObstacles(self, obstacleGrid):
if obstacleGrid is None or len(obstacleGrid) == 0 or len(obstacleGrid[0]) == 0: return 0
lenRow, lenCol = len(obstacleGrid), len(obstacleGrid[0])
dp = [0 for i in xrange(lenCol)]
dp[0] = 1
for i in xrange(lenRow):
for j in xrange(lenCol):
if obstacleGrid[i][j] == 1:
dp[j] = 0
else:
if j > 0:
dp[j] += dp[j - 1]
return dp[lenCol - 1]