题目1: 62. 不同路径
- 题目链接:62. 不同路径
1- 思路
机器人每次只能向下或者向右移动一步
- 1. 确定 dp 数组大小及下标含义
- 本题思路类似于 爬楼梯(由于只能向下或者向右移动),当前位置上的路径种类等于
dp[i-1][j] + dp[i][j-1]
- dp 数组大小就是当前矩阵的大小,下标对应每个位置的路径种类
- 本题思路类似于 爬楼梯(由于只能向下或者向右移动),当前位置上的路径种类等于
- 2. 递推公式
dp[i][j] = dp[i-1][j] + dp[i][j-1]
- 3. 初始化 dp 数组
- 其中 第一行和第一列的走法只有一种 ,因此利用 for 循环 初始化 矩阵的第一行和第一列为 1
- 4. 确定遍历顺序
- 从
i = 1 , j = 1
开始遍历
- 从
- 5. 模拟dp数组值
2- 题解
⭐ 不同路径——题解思路
class Solution {
public int uniquePaths(int m, int n) {
// 1. 确定dp 数组
int[][] dp = new int[m][n];
// 2. 递推公式 dp[i][j] = dp[i-1][j]+dp[i][j-1]
// 3. 初始化 dp 数组
for(int i = 0 ; i < n;i++){
dp[0][i] = 1;
}
for(int i = 0 ; i < m;i++){
dp[i][0] = 1;
}
// 从 i = 1 , j = 1 开始遍历
for(int i = 1 ; i < m;i++){
for(int j = 1 ; j < n;j++){
dp[i][j] = dp[i-1][j]+dp[i][j-1];
}
}
return dp[m-1][n-1];
}
}
题目2: 63. 不同路径 II
- 题目链接:63. 不同路径 II
1- 思路
本题区分于不同路径的情况在于,本题增加了障碍物的情况
动规五部曲
- 1. 确定 dp 数组大小及下标含义
- dp 数组的大小为给定的数组的大小
- 2. 确定递推公式
- 递推公式不变
dp[i][j] = dp[i-1][j] + dp[i][j-1]
- 递推公式不变
- 3. dp 数组初始化
- 初始化过程遇到障碍物 即 为
0
则终止循环,即第一行第一列初始化为1
,直到遇到障碍物。
- 初始化过程遇到障碍物 即 为
- 4. 遍历顺序
- 从
i = 1 , j = 1
开始遍历 ,遇到障碍物的情况则直接将dp[i][j]
赋值为 0
- 从
- 5. 模拟 dp 数组值
2- 题解
⭐ 不同路径 II——题解思路
class Solution {
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
// 1. 定义 dp 数组
int m = obstacleGrid.length;
int n = obstacleGrid[0].length;
int[][] dp = new int[m][n];
// 2. 递推公式 dp[i][j] = dp[i-1][j] + dp[i][j-1]
// 3. 初始化 dp 数组
for(int i = 0 ; i < m && obstacleGrid[i][0]==0 ;i++){
dp[i][0] = 1;
}
for(int i = 0 ; i < n && obstacleGrid[0][i]==0 ;i++){
dp[0][i] = 1;
}
// 4. 遍历顺序
for(int i = 1 ; i < m;i++){
for(int j = 1 ; j < n;j++){
if(obstacleGrid[i][j]==1){
dp[i][j] = 0;
continue;
}
dp[i][j] = dp[i-1][j] + dp[i][j-1];
}
}
return dp[m-1][n-1];
}
}