1 题目
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
问总共有多少条不同的路径?
例如,上图是一个7 x 3 的网格。有多少可能的路径?
示例 1:
输入: m = 3, n = 2
输出: 3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。
- 向右 -> 向右 -> 向下
- 向右 -> 向下 -> 向右
- 向下 -> 向右 -> 向右
示例 2:
输入: m = 7, n = 3
输出: 28
提示:
1 <= m, n <= 100
题目数据保证答案小于等于 2 * 10 ^ 9
2 Java
2.1 方法一(回溯正向递归,超时)
class Solution {
int sum = 0;
public int uniquePaths(int m, int n) {
helper(0, 0, m, n);
return sum;
}
public void helper(int i, int j, int m, int n){
// if判断是否记录结果
if(i == m - 1 && j == n - 1){
sum++; return;
}
// for循环多路选择
if(i < m - 1) helper(i + 1, j, m, n);
if(j < n - 1) helper(i, j + 1, m, n);
}
}
2.2 方法二(动规正向迭代)
class Solution {
public int uniquePaths(int m, int n) {
// 创建备忘录(不用初始化,在for里单另情况写吧)
int[][] dp = new int[m][n];
// 外层for向前步进
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++){
if(i == 0 && j == 0) dp[i][j] = 1;
else if(i == 0) dp[i][j] = dp[i][j - 1];
else if(j == 0) dp[i][j] = dp[i - 1][j];
// 内层for多路择优(从2种状态跳转)
else dp[i][j] = dp[i][j - 1] + dp[i - 1][j];
}
}
return dp[m - 1][n - 1];
}
}
2.3 方法三(动规逆向递归)
class Solution {
int[][] dp;
public int uniquePaths(int m, int n) {
// 初始化备忘录
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;
helper(m - 1, n - 1);
return dp[m - 1][n - 1];
}
public int helper(int i, int j){
// if判断是否有记录
if(dp[i][j] != 0) return dp[i][j];
// for循环多路择优
dp[i][j] = helper(i - 1, j) + helper(i, j - 1);
return dp[i][j];
}
}