63.不同路径Ⅱ
🚀 题目
题目来源:leetcode 63. 不同路径Ⅱ:63. 不同路径 II - 力扣(LeetCode);
给定一个 m x n
的整数数组 grid
。一个机器人初始位于 左上角(即 obstacleGrid[0][0]
)。机器人尝试移动到 右下角(即 obstacleGrid[m - 1][n - 1]
)。机器人每次只能向下或者向右移动一步。
网格中的障碍物和空位置分别用 1
和 0
来表示。机器人的移动路径中不能包含 任何 有障碍物的方格。
返回机器人能够到达右下角的不同路径数量。
🚁 解答
🚆 初始化
dp[][]数组
,表示指定格子位置有多少种路径数量,0表示没有路径到达该位置- 将第一行和第一列都初始化为 1(注意,当第一行和第一列遇到一个障碍后,其后面的都不能到达了,都初始化为 0,也就是默认值)
- 有障碍的地方初始化为 0,表示不可到达
🚇 递推公式
dp[i][j] == dp[i][j - 1] + dp[i - 1][j]
,当obstacleGrid[i][j] != 1
(也就是没有障碍的时候)的时候才进行递推,否则不递推
🚠 代码
class Solution {
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
// 记录格子大小
int x = obstacleGrid.length;
int y = obstacleGrid[0].length;
int[][] dp = new int[x][y];
// 初始化 y 轴列
for(int i = 0; i < x && obstacleGrid[i][0] != 1; i++) dp[i][0] = 1;
// 初始化 x 轴行
for(int i = 0; i < y && obstacleGrid[0][i] != 1; i++) dp[0][i] = 1;
for(int i = 1; i < x; i++){
for(int j = 1; j < y; j++){
if(obstacleGrid[i][j] != 1){
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
}
}
}
return dp[x - 1][y - 1];
}
}