不同路径
描述
- 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 "Start" )
- 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 "Finish" )
- 问总共有多少条不同的路径?
示例 1
输入:m = 3, n = 7
输出:28
示例 2
输入:m = 3, n = 2
输出:3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。
- 向右 -> 向下 -> 向下
- 向下 -> 向下 -> 向右
- 向下 -> 向右 -> 向下
示例 3
输入:m = 7, n = 3
输出:28
示例 4
输入:m = 3, n = 3
输出:6
提示
- 1 <= m, n <= 100
- 题目数据保证答案小于等于 2 * 1 0 9 10^9 109
Typescript 版算法实现
1 ) 方案1: 排列组合
ts
function uniquePaths(m: number, n: number): number {
// 计算组合数 C(m+n-2, m-1) 或 C(m+n-2, n-1)
// 选择较小的那个计算以减少循环次数
const k = Math.min(m - 1, n - 1);
let result = 1;
for (let i = 1; i <= k; i++) {
result *= (m + n - 1 - i);
result = Math.floor(result / i); // 确保每一步都是整数除法
}
return result;
}
2 )方案2: 组合优化版
ts
function uniquePaths(m: number, n: number): number {
let ans = 1;
for (let x = n, y = 1; y < m; ++x, ++y) {
ans = Math.floor(ans * x / y);
}
return ans;
};
3 ) 方案3: 动态规划
ts
function uniquePaths(m: number, n: number): number {
const f = new Array(m).fill(0).map(() => new Array(n).fill(0));
for (let i = 0; i < m; i++) {
f[i][0] = 1;
}
for (let j = 0; j < n; j++) {
f[0][j] = 1;
}
for (let i = 1; i < m; i++) {
for (let j = 1; j < n; j++) {
f[i][j] = f[i - 1][j] + f[i][j - 1];
}
}
return f[m - 1][n - 1];
}
4 ) 方案4: 动态规划优化版
ts
function uniquePaths(m: number, n: number): number {
const f = new Array(n).fill(1)
for (let i = 1; i < m; i++) {
for (let j = 1; j < n; j++) {
f[j] += f[j-1]
}
}
return f[n - 1];
};