刷刷刷 Day 39 | 62. 不同路径
62. 不同路径
LeetCode题目要求
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?
示例
输入:m = 3, n = 2
输出:3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。
1. 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右
3. 向下 -> 向右 -> 向下
解题思路
// 要到的右下角,必须先到右 或者 下
// 以 m = 3,n = 2 为例,从左上角开始走,
/**
| 0 | 1
-----------
0 | 0 | x
1 | x | x
2 | x | x
*/
// 路径 1. 右 -> 下 -> 下 右后面没有就只能往下
// 路径 2. 下 -> 下 -> 右 一直下再往右
// 路径 3. 下 -> 右 -> 下 先下再右再下
// 从起点开始,有两种路径可走,往右 或 往下
//
// 从左上到右下移动,每次一步
// 动规五部曲
// 1. dp[i][j] 数组 , 表示从 [0,0] 到 [i,j] 有 dp[i][j] 种方法
// 2. 递推公式 dp[i][j] = dp[i][j-1] + dp[i-1][j]
// 3. 初始化数组 dp[i][j] ,
// 从 [0,0] 到 [i,0] 时,只有一条路径,那么 dp[i][0] = 1,
// 从 [0,0] 到 [0,j] 时,只有一条路径,那么 dp[0][j] = 1
// 4. 遍历顺序
上代码
class Solution {
public int uniquePaths(int m, int n) {
// 要到的右下角,必须先到右 或者 下
// 以 m = 3,n = 2 为例,从左上角开始走,
/**
| 0 | 1
-----------
0 | 0 | x
1 | x | x
2 | x | x
*/
// 路径 1. 右 -> 下 -> 下 右后面没有就只能往下
// 路径 2. 下 -> 下 -> 右 一直下再往右
// 路径 3. 下 -> 右 -> 下 先下再右再下
// 从起点开始,有两种路径可走,往右 或 往下
//
// 从左上到右下移动,每次一步
// 动规五部曲
// 1. dp[i][j] 数组 , 表示从 [0,0] 到 [i,j] 有 dp[i][j] 种方法
// 2. 递推公式 dp[i][j] = dp[i][j-1] + dp[i-1][j]
// 3. 初始化数组 dp[i][j] ,
// 从 [0,0] 到 [i,0] 时,只有一条路径,那么 dp[i][0] = 1,
// 从 [0,0] 到 [0,j] 时,只有一条路径,那么 dp[0][j] = 1
// 4. 遍历顺序
int[][] dp = new int[m][n];
for (int i = 0; i < m; i++) {
dp[i][0] = 1;
}
for (int j = 0; j < n; j++) {
dp[0][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];
}
}
重难点
附:学习资料链接