题目:
一个机器人位于一个
m x n
网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。
现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?
网格中的障碍物和空位置分别用
1
和0
来表示。来源:力扣(LeetCode)
链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
示例:
示例 1:
输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]
输出:2
解释:3x3 网格的正中间有一个障碍物。 从左上角到右下角一共有2
条不同的路径: 1. 向右 -> 向右 -> 向下 -> 向下 2. 向下 -> 向下 -> 向右 -> 向右
示例 2:
输入:obstacleGrid = [[0,1],[0,0]]
输出:1
解法:
创建m*n的表格,m是obstacleGrid的行数,n是obstacleGrid的列数。表格第1行、列初始化为1,如果第1行、列有障碍,那么从此位置开始及后面的所有位置都置为0,表示此路不通,其它位置初始化为-1。
然后遍历表格右下角区域(去除第1行、列),每个位置更新为上面和左边的和,障碍不更新,最后返回右下角值。
代码:
class Solution: def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int: m = len(obstacleGrid) n = len(obstacleGrid[0]) f = [[1] * n] + [[1] + [-1] * (n - 1) for _ in range(m - 1)] flag1 = flag2 = 0 for index1, r in enumerate(obstacleGrid): for index2, c in enumerate(r): if index1 == 0: if flag1 == 1: f[index1][index2] = 0 elif c == 1: flag1 = 1 f[index1][index2] = 0 flag2 = 1 if index2 == 0 else flag2 else: if index2 == 0: if flag2 == 1: f[index1][index2] = 0 elif c == 1: flag2 = 1 f[index1][index2] = 0 else: if c == 1: f[index1][index2] = 0 for i in range(1, m): for j in range(1, n): if f[i][j] != 0: f[i][j] = f[i - 1][j] + f[i][j - 1] return f[m - 1][n - 1]