目录
🎬 攻城狮7号:个人主页
🔥 个人专栏: 《C/C++算法》
⛺️ 君子慎独!
🌈 大家好,欢迎来访我的博客!
⛳️ 此篇文章主要讲解算法题目:解不同路径
📚 本期文章收录在《C/C++算法》,大家有兴趣可以自行查看!
⛺️ 欢迎各位 ✔️ 点赞 👍 收藏 ⭐留言 📝!
一、题目
一个机器人位于一个 m x n
网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?
示例 1:
输入:m = 3, n = 7 输出:28
示例 2:
输入:m = 3, n = 2 输出:3 解释: 从左上角开始,总共有 3 条路径可以到达右下角。 1. 向右 -> 向下 -> 向下 2. 向下 -> 向下 -> 向右 3. 向下 -> 向右 -> 向下
示例 3:
输入:m = 7, n = 3 输出:28
示例 4:
输入:m = 3, n = 3 输出:6
提示:
1 <= m, n <= 100
- 题目数据保证答案小于等于
2 * 10^9
二、解题思路
核心思路
-
移动规则
(1)从起点到终点,总共需要移动 m+n−2 次。
(2)其中,向下移动 m−1 次,向右移动 n−1 次。
-
组合数学原理
(1)路径总数等价于从 m+n−2 次移动中选择 m−1 次向下移动的组合数。
(2)组合数公式为:
因此我们直接计算出这个组合数即可。计算的方法有很多种:
(1)如果使用的语言有组合数计算的 API,我们可以调用 API 计算;
(2)如果没有相应的 API,我们可以使用上面的公式进行计算。
三、代码实现
#include <iostream>
class Solution {
public:
// 计算从左上角到右下角的唯一路径数量
// 使用组合数的方法:C(m+n-2, m-1)
int uniquePaths(int m, int n) {
long long ans = 1;
// 从n开始,因为从起点到第一行末尾有n种走法(全部向右)
// 每次迭代相当于确定了一个向右或向下的方向
for (int x = n, y = 1; y < m; ++x, ++y) {
// 使用阶乘的性质计算组合数,避免大数溢出
// ans = ans * (x / y) 相当于 ans = ans * (当前总步数 / 已向下步数)
ans = ans * x / y;
}
return ans;
}
};
int main() {
Solution solution;
int m, n;
std::cout << "请输入网格的行数m和列数n:";
std::cin >> m >> n;
int result = solution.uniquePaths(m, n);
std::cout << "从左上角到右下角的唯一路径数量为:" << result << std::endl;
return 0;
}
复杂度分析
时间复杂度:O(m)。由于我们交换行列的值并不会对答案产生影响,因此我们总可以通过交换 m 和 n 使得 m≤n,这样时间复杂度降低至 O(min(m,n))。
空间复杂度:O(1)。
看到这里了还不给博主点一个:
⛳️ 点赞
☀️收藏
⭐️ 关注
!
💛 💙 💜 ❤️ 💚💓 💗 💕 💞 💘 💖
再次感谢大家的支持!
你们的点赞就是博主更新最大的动力!