63.不同路径2 一个机器人位于一个 m x n
网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。
现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?
网格中的障碍物和空位置分别用 1
和 0
来表示。
示例 1:
1 2 3 4 5 6 输入:obstacleGrid = [[0 ,0 ,0 ],[0 ,1 ,0 ],[0 ,0 ,0 ]] 输出:2 解释:3x3 网格的正中间有一个障碍物。 从左上角到右下角一共有 2 条不同的路径: 1. 向右 -> 向右 -> 向下 -> 向下2. 向下 -> 向下 -> 向右 -> 向右
示例 2:
1 2 输入:obstacleGrid = [[0 ,1 ],[0 ,0 ]] 输出:1
Solution
这道题和上一道的区别只是在于:增加了障碍物
遇到了障碍物时,dp状态为0,表示不可达
如果在初始时遇到了障碍物,那么把障碍物以及之后的位置都置为0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 class Solution { public int uniquePathsWithObstacles (int [][] obstacleGrid) { int m = obstacleGrid.length; int n = obstacleGrid[0 ].length; int [][] dp = new int [m][n]; if (obstacleGrid[m - 1 ][n - 1 ] == 1 || obstacleGrid[0 ][0 ] == 1 ) { return 0 ; } for (int i = 0 ; i < m && obstacleGrid[i][0 ] == 0 ; i++) { dp[i][0 ] = 1 ; } for (int j = 0 ; j < n && obstacleGrid[0 ][j] == 0 ; j++) { dp[0 ][j] = 1 ; } for (int i = 1 ; i < m; i++) { for (int j = 1 ; j < n; j++) { dp[i][j] = (obstacleGrid[i][j] == 0 ) ? dp[i - 1 ][j] + dp[i][j - 1 ] : 0 ; } } return dp[m - 1 ][n - 1 ]; } }
1维数组dp版本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 class Solution { public int uniquePathsWithObstacles (int [][] obstacleGrid) { int m = obstacleGrid.length; int n = obstacleGrid[0 ].length; int [] dp = new int [n]; for (int j = 0 ; j < n && obstacleGrid[0 ][j] == 0 ; j++) { dp[j] = 1 ; } for (int i = 1 ; i < m; i++) { for (int j = 0 ; j < n; j++) { if (obstacleGrid[i][j] == 1 ) { dp[j] = 0 ; } else if (j != 0 ) { dp[j] += dp[j - 1 ]; } } } return dp[n - 1 ]; } }