#动态规划 LeetCode 63 不同路径 II
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?
网格中的障碍物和空位置分别用 1
和 0
来表示。
说明:m 和 n 的值均不超过 100。
示例 1:
输入: [ [0,0,0], [0,1,0], [0,0,0] ] 输出: 2 解释: 3x3 网格的正中间有一个障碍物。 从左上角到右下角一共有2
条不同的路径: 1. 向右 -> 向右 -> 向下 -> 向下 2. 向下 -> 向下 -> 向右 -> 向右
思路:
- 和上一题很类似,只不过多了个路障。
- 选择的方法是,使用一个新的二维数组重新记录路径。这样可以避免1这个数字的影响
- 剩下的只需要单独进行处理路障就可以,其余思路和上一题一致。
class Solution { public int uniquePathsWithObstacles(int[][] obstacleGrid) { int m = obstacleGrid.length; if(m == 0 || obstacleGrid[0][0] == 1) return 0; int n = obstacleGrid[0].length; int[][] num = new int[m][n]; for(int i =0 ; i<m ; i++) for(int j=0 ; j<n ; j++) if(obstacleGrid[i][j] == 1) num[i][j] = -1; else num[i][j] = 0; if(obstacleGrid[m-1][n-1] != 1) num[m-1][n-1]=1; for(int i = m-1 ; i>=0 ; i--) for(int j=n-1 ; j>=0 ; j--) if(num[i][j]!=-1){ if(i==m-1){ if(j!=n-1){ int right = num[i][j+1]; if(right != -1) num[i][j] = right; } } else{ if(j!=n-1){ int right = num[i][j+1]; int down = num[i+1][j]; if(right == -1 && down == -1) continue; else if(right == -1) num[i][j] = down; else if(down == -1) num[i][j] = right; else num[i][j] = right+down; } else{ int down = num[i+1][j]; if(down != -1) num[i][j] = down; } } } return num[0][0]; } }