给定一个 m x n
的整数数组 grid
。一个机器人初始位于 左上角(即 grid[0][0]
)。机器人尝试移动到 右下角(即 grid[m - 1][n - 1]
)。机器人每次只能向下或者向右移动一步。
网格中的障碍物和空位置分别用 1
和 0
来表示。机器人的移动路径中不能包含 任何 有障碍物的方格。
返回机器人能够到达右下角的不同路径数量。
测试用例保证答案小于等于 2 * 109
。
示例 1:
输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]] 输出:2 解释:3x3 网格的正中间有一个障碍物。 从左上角到右下角一共有 2 条不同的路径: 1. 向右 -> 向右 -> 向下 -> 向下 2. 向下 -> 向下 -> 向右 -> 向右
示例 2:
输入:obstacleGrid = [[0,1],[0,0]] 输出:1
提示:
m == obstacleGrid.length
n == obstacleGrid[i].length
1 <= m, n <= 100
obstacleGrid[i][j]
为0
或1
我的解答:
class Solution {public int uniquePathsWithObstacles(int[][] obstacleGrid) {int y_end = obstacleGrid.length;int x_end = obstacleGrid[0].length;// 标记数组,需要比原数组长1,允许走到界外int[][] dps = new int[y_end + 1][x_end + 1];// 初始化数组元素为-1,标识是否走到过该位置for(int y = 0;y <= y_end; y++){for(int x = 0;x <= x_end; x++){dps[y][x] = -1;}}return dpsFun(dps,0,0,obstacleGrid);}/**dps:标识数组x:当前位置横坐标y:当前位置纵坐标obstacleGrid:原数组*/private int dpsFun(int[][] dps,int x,int y,int[][] obstacleGrid){// 元素不为-1,说明已经走过了,剪枝if(dps[y][x] != -1) return dps[y][x];// 如果当前位置为障碍物或界外,返回0并标记此路已走过if(y >= obstacleGrid.length || x >= obstacleGrid[0].length || obstacleGrid[y][x] == 1) return dps[y][x] = 0;// 如果当前位置为终点,则返回1并标记此路已走过if(x == obstacleGrid[0].length - 1 && y == obstacleGrid.length - 1) return dps[y][x] = 1;// 当前位置向右或向下走有几种可行方案return dps[y][x] = dpsFun(dps,x + 1,y,obstacleGrid) + dpsFun(dps,x,y + 1,obstacleGrid);}
}