1、题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
示例 1:
输入:n = 2
输出:2
示例 2:
输入:n = 7
输出:21
示例 3:
输入:n = 0
输出:1
2、VS2019上运行
递推法
#include <iostream>
class Solution {
public:
int numWays(int n) {
if (n == 0)
return 1; // 没有台阶,直接在上面,一种方法
else if (n <= 2)
return n; // 一个或两个台阶
int a = 1, b = 2, c = 0; // a保存f(n-2), b保存f(n-1), c保存f(n)
for (int i = 3; i <= n; ++i) // i:第i个台阶
{
c = (a + b) % 1000000007; // 第i个台阶跳法:a:i-2个台阶跳法,b:i-1个台阶跳法
a = b; // a保存b
b = c; // b保存c
}
return c;
}
};
int main() {
int n = 7;
Solution s;
int ways = s.numWays(n);
std::cout << "Number of ways to climb " << n << " stairs: " << ways << std::endl;
return 0;
}
运行结果:
Number of ways to climb 7 stairs: 21
3、解题思路
- 1.首先,判断特殊情况。如果 n=0,说明没有台阶需要跳,直接返回 1,表示一种方法。
- 2.接下来,处理 n 小于等于 2 的情况。这是因为青蛙一次可以跳一级或两级的台阶,所以当 n 等于 1 或 2 时,分别只有一种和两种方法可以到达目标位置,直接返回对应的台阶数。
- 3.对于 n 大于等于 3 的情况,采用动态规划的方法求解。定义三个变量 a、b 和 c,分别表示 f(n-2)、f(n-1) 和 f(n),其中 f(n) 表示跳上第 n 级台阶的方法数。
- 4.利用循环从第 3 级台阶开始计算并更新 a、b 和 c 的值。根据动态规划的思想,f(n) 的值由前两项 f(n-2) 和 f(n-1) 的值决定。具体计算方法为 c = (a + b) % 1000000007,这是为了防止结果过大导致整数溢出。
- 5.循环结束后,c 的值即为跳上第 n 级台阶的方法数,将其作为函数的返回值。