一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?
输入:
[
[0,0,0],
[0,1,0],
[0,0,0]
]
输出: 2
解释:
3x3 网格的正中间有一个障碍物。
从左上角到右下角一共有 2 条不同的路径:
- 向右 -> 向右 -> 向下 -> 向下
- 向下 -> 向下 -> 向右 -> 向右
map[i][j]表示经过该位置有种路径。
//重点在于设置一个额外的数组,不要在原数组上改
关键在于把不可达的点设为0
何时使用【回溯】,何时使用【动态规划】,用大白话说,
就是:
1.首先看取值范围,递归回溯一维数组,100就是深度的极限了
2.如果是求走迷宫的【路径】,必然是回溯;
如果是走迷宫的【路径的条数】,必然是dp--------(这个竟然屡试不爽!!!!)
class Solution {
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
int m = obstacleGrid.length, n = obstacleGrid[0].length;
if(obstacleGrid[0][0]==1 || obstacleGrid[m-1][n-1]==1) return 0;
int[][] map = new int[m][n];//重点在于设置一个额外的数组
for(int j = 0; j < n; j++){
if(obstacleGrid[0][j]==1) break;
map[0][j]=1;
}
for(int i = 0; i < m; i++){
if(obstacleGrid[i][0]==1) break;
map[i][0]=1;
}
for(int i = 1; i < m; i++){
for(int j = 1; j < n; j++){
if(obstacleGrid[i][j]==1) continue;
map[i][j]=map[i-1][j]+map[i][j-1];
}
}
return map[m-1][n-1];
}
}
class Solution {
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
int m = obstacleGrid.length, n = obstacleGrid[0].length;
int[][] map = new int[m][n];
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++){
if(obstacleGrid[i][j] == 1) continue;
if(i == 0 && j == 0) {map[0][0] = 1; continue;}
if(i == 0) map[i][j] = map[i][j - 1];
else if(j == 0) map[i][j] = map[i - 1][j];
else map[i][j] = map[i - 1][j] + map[i][j - 1];
}
}
return map[m-1][n-1];
}
}