不同路径 II
一个机器人位于一个 m x n 网格的左上角 (起始点标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角。
现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?
示例 1:
输入:
[
[0,0,0],
[0,1,0],
[0,0,0]
]
输出: 2
解释:
3x3 网格的正中间有一个障碍物。
从左上角到右下角一共有 2
条不同的路径:
1. 向右 -> 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右 -> 向右
解决思路:
相比于上节内容,本题网格中存在障碍物,故需要额外考虑两点。
1,若最下面一行中某个网格存在障碍物,则该网格的前面网格都无法到达end;
0 | 0 | 障碍物 | 1 | end |
(网格[2][2]存在障碍物,则网格[2][0]与[2][1]均不可达end)
2,对于网格a,到达end要么通过b,要么通过c,故a到end的总路径
paths(a) = 0,如果a处存在障碍物;
paths(a) = paths(b) + paths(c),如果a处不存在障碍物。
实现代码:
先将网格的最下面一行与最右面一列填写完成,在填写其它网格。
public static int test(int[][] obstacleGrid) { boolean lastLine = false; int M = obstacleGrid.length; int N = obstacleGrid[0].length; for (int j=N-1; j>=0; j--) { lastLine = obstacleGrid[M-1][j]==1?true:lastLine; obstacleGrid[M-1][j] = lastLine?0:1; } for (int i=M-2; i>=0; i--) obstacleGrid[i][N-1] = obstacleGrid[i][N-1]==1?0:obstacleGrid[i][N-1]+obstacleGrid[i+1][N-1]; for (int j=N-2; j>=0; j--) for (int i=M-2; i>=0; i--) obstacleGrid[i][j] = obstacleGrid[i][j]==1?0:obstacleGrid[i+1][j]+obstacleGrid[i][j+1]; return obstacleGrid[0][0]; }
posted on 2018-05-16 19:26 Deltadeblog 阅读(147) 评论(0) 编辑 收藏 举报