不同路径
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.求解
排列组合

代码如下
/*
执行用时:0 ms, 在所有 Java 提交中击败了100.00% 的用户
内存消耗:35.1 MB, 在所有 Java 提交中击败了87.21% 的用户
*/
public int uniquePaths(int m, int n) {
if(m > n){
return uniquePaths(n, m);
}
long ans = 1;
for(int x = n, y = 1; y < m; x++, y++){
ans = ans * x / y;
}
return (int) ans;
}
-
时间复杂度:O(min(m,n))
-
空间复杂度:O(1)
动态规划
-
我们使用
i,j来表示从左上角走到(i, j)所走的步数,其中i < m,j < n -
每次只能向下或者向右走一步,向下走一步那么会从
(i - 1, j)走来,向右走一步会从(i, j - 1)走来于是得出动态规划方程
dp[i][j] = dp[i - 1][j] + dp[i][j - 1] -
对于第一行
dp[0][j],或者第一列dp[i][0],由于都是在边界,所以只能为1
代码如下
/*
执行用时:0 ms, 在所有 Java 提交中击败了100.00% 的用户
内存消耗:35.3 MB, 在所有 Java 提交中击败了71.93% 的用户
*/
public 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];
}
- 时间复杂度、空间复杂度均为O(m * n)

浙公网安备 33010602011771号