原题链接:
https://leetcode-cn.com/problems/qing-wa-tiao-tai-jie-wen-ti-lcof/
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。
示例1:
输入:n = 2
输出:2
示例2:
输入:n = 7
输出:21
示例3:
输入:n = 0
输出:1
提示:
0 <= n <= 100
解题思路
此类求多少种可能性的题目一般都有 递推性质
即 f(n) 和 f(n-1)…f(1)之间是有联系的。
- 设跳上n级台阶有f(n)种跳法。在所有跳法中,青蛙的最后一步只有两种情况: 跳上1级或2级台阶。
- 当为1级台阶时: 剩余n-1个台阶,共f(n-1)种跳法。
- 当为2级台阶时: 剩余n-2个台阶,共f(n-2)种跳法。
- f(n)=f(n-1)+f(n-2).与斐波那契数列性质等价。
C语言代码:
int numWays(int n){
int a[101],i;
a[0]=a[1]=1;
for(i=2;i<=n;i++){
a[i]=(a[i-1]+a[i-2])%1000000007;
}
return a[n];
}
超时代码:
int numWays(int n){
if(n<2) return 1;
else return numWays(n-1)%1000000007+numWays(n-2)%1000000007;
}
}
思路:
采取递归思想,含大量重复计算,超时。
空间进一步优化的代码:
int numWays(int n){
int a = 1, b = 1, c = 1, i;
for(i=2;i<=n;i++){
c=(a+b)%1000000007;
a = b;
b = c;
}
return c;
}