Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
题目
一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
示例 1:
输入:n = 2 输出:2
示例 2:
输入:n = 7 输出:21
示例 3:
输入:n = 0 输出:1
提示:
- 0 <= n <= 100
思路
递归解法:
这里可以联想到斐波那契数列,根据题意可以发现,其青蛙跳台阶的公式为:f(n) = f(n -2) + f(n -1 )
于是可以编写出我们的代码:
class Solution {
public:
int numWays(int n) {
int a[1089849];
if(n<=1) return 1;
a[1]=1,a[0]=1;
for(int i=2;i<=n;i++){
// 这里要注意对结果取模
a[i]=(a[i-1]+a[i-2])%1000000007;
}
return a[n];
}
};
循环求余法:
大数越界: 随着 n 增大, f(n) 会超过 Int32 甚至 Int64 的取值范围,导致最终的返回值错误。那这时我们可以使用循环求余法。即用三个数字不断的模拟结果,我们都知道递归公式等于f(n) = f(n -2) + f(n -1 ),也可以这样理解,即后面的结果等于前两个数的结果之和。于是我们定义a, b ,sum,每一次sum = a+ b,a=b,b=sum;这样做把时间复杂度降低为O(n),空间复杂度也大大降低。
代码
class Solution {
public:
int numWays(int n) {
// 如果青蛙跳的阶数小于2,那么只有一种情况
if(n < 2) return 1;
int p = 1,q = 1, r =0;
for(int i = 2;i <= n;i ++)
{
r = (p + q) % 1000000007;
p = q;
q = r;
}
return r;
}
};