62 不同路径
**题目:**一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?
示例1:
示例 2:
输入:m = 3, n = 2
输出:3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。
- 向右 -> 向下 -> 向下
- 向下 -> 向下 -> 向右
- 向下 -> 向右 -> 向下
示例 3:
输入:m = 7, n = 3
输出:28
示例 4:
输入:m = 3, n = 3
输出:6
解题思路:
**方法一:**动态规划 二维方法
1.定义dp数组
dp[i][j] :表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径
2.定义递推公式
确定推导过程 dp[i][j]=dp[i-1][j]+dp[i][j-1]
3.初始化
for(i = 0 ; i < m ; i++ ){
dp[i][0]=1;
}
for(j=0 ; j<n ; j++){
dp[0][j]=1;
}
4.遍历顺序
从左上到右下
代码如下:
public static int uniquePaths(int m, int n) {
int[][] dp = new int[m][n];
//初始化
for (int i = 0; i < m; i++) {
dp[i][0] = 1;
}
for (int i = 0; i < n; i++) {
dp[0][i] = 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];
}
**方法一:**动态规划 一维方法
一维方法是二维数组滚动数组
1.定义dp数组
dp[n]表示第i行n处的路径数
在遍历过程中 每遍历一行 dp[n] 都会被更新
2.定义递推公式
dp[i]=dp[i]+dp[i-1]
现在要确定下一行的值(新的dp[i]) 其实在二维数组中是 加上数组正上方和左边的值 正上方的值就是上一行的值dp[i] 左边的值就是更新后的dp[i-1]
i从1开始遍历更新 因为新一行的dp[0]=1(二维数组初始化时 第一列初始化为1)
3.初始化
for (int i = 0; i < n; i++) dp[i] = 1;
4.遍历顺序
从左上到右下
代码如下:
class Solution {
public:
int uniquePaths(int m, int n) {
vector<int> dp(n);
for (int i = 0; i < n; i++) dp[i] = 1;
for (int j = 1; j < m; j++) {
for (int i = 1; i < n; i++) {
dp[i] += dp[i - 1];
}
}
return dp[n - 1];
}
};
63. 不同路径 II
**解题思路:**与不同路径I很相似 但如果有障碍物 需要将这个坐标的方法数置为0
题目:
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?网格中的障碍物和空位置分别用 1 和 0 来表示。
示例1:
示例2:
题目链接:63. 不同路径 II
代码如下:
//初始化dp数组明白含义 从出发点到ij点的方法个数
//确定推导过程 dp[i][j]=dp[i-1][j]+dp[i][j-1]
//初始化
//确定遍历
class Solution {
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
//特殊情况
if(obstacleGrid[0][0]==1 ||
obstacleGrid[obstacleGrid.length-1][obstacleGrid[0].length-1]==1){
return 0;
}
int dp[][]=new int[obstacleGrid.length][obstacleGrid[0].length];
int i,j;
//初始化
for(i = 0; i < obstacleGrid.length&&obstacleGrid[i][0] == 0; i++){
dp[i][0]=1;
}
for(j= 0; j < obstacleGrid[0].length&&obstacleGrid[0][j] == 0; j++){
dp[0][j]=1;
}
for(i = 1;i < obstacleGrid.length;i++){
for(j = 1;j < obstacleGrid[0].length;j++){
if(obstacleGrid[i][j]==0){
dp[i][j]=dp[i-1][j]+dp[i][j-1];
}
else{
dp[i][j]=0;
}
}
}
return dp[i-1][j-1];
}
}