63-不同路径

63、不同路径

https://leetcode-cn.com/problems/unique-paths-ii/

题目:

aRFWJe.png

题解:

一道动态规划题,要想知道走到终点(i,j)的路径Z(i,j)有多少条,我们只需要知道Z(i-1,j)和Z(i,j-1)的到达路径数,相加即可。

因为此题的特点,我们可以获得一波初始值,并且从起点开始递推计算到重点。因为机器人只能向右或者向下走,所以第0行,和第0列的路径数一定是固定的。比如说第0行,要想到达第0行的任一元素,就必须从该元素的左边走过去;第0列也同样,必须从该元素的上面下来。因此,我们便获得了第0行和第0列所有位置的路径数,然后循环遍历整个二位数组,判断当前坐标是否有障碍物,如果有则到达该路径数Z(X,X)为0,如果没有则Z(X,X)=Z(i-1,j)+Z(i,j-1),这样便得到了最终的路径数。

坑点:此题在开始时初始化第0行和第0列元素时,一定要注意,比如从左向右遍历第0行时,如果一旦发现障碍物,那右边的元素一定都为0,因为必须从左经过,但左边已经被堵住了;第0列的初始化同理,这里我报错了好多次,因为脑子笨只能自己画图来找问题。没办法,终归是菜。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution:
def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:
if obstacleGrid[0][0] == 1:
return 0
m = len(obstacleGrid[0])
n = len(obstacleGrid)
res = [[0 for _ in range(m)] for _ in range(n)]
for i in range(m):
if obstacleGrid[0][i] == 0:
res[0][i] = 1
else:
break
for i in range(n):
if obstacleGrid[i][0] == 0:
res[i][0] = 1
else:
break
for i in range(1, n):
for j in range(1, m):
if obstacleGrid[i][j] == 0:
res[i][j] = res[i-1][j] + res[i][j-1]
return res[n-1][m-1]

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器