题目描述:剑指 Offer 10- II. 青蛙跳台阶问题
一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。(0 <= n <= 100)
- 示例 1:
- 输入:n = 0
- 输出:1
- 示例 2:
- 输入:n = 7
- 输出:21
题解
1.假如只有1级台阶,只有一种跳法;假如有2级台阶,那就有2种跳法:一种是分两次跳,每次跳一下;另一种就是一次跳两下。
2.讨论一般情况。把n阶台阶时的跳法看成n的函数,记为f(n)。当n>2时,第一次跳的时候就有两种不同的选择:
(1)第一次跳1级,此时跳法数目等于后面剩下的(n-1)级台阶的跳法数目,即为f(n-1)。
(2)第一次跳2级,此时跳法数目等于后面剩下的(n-2)级台阶的跳法数目,即为f(n-2)。
因此,n级台阶的不同跳法的总数f(n)=f(n-1)+f(n-2),即为斐波那契数列,只是起始数值不同。
- 青蛙跳台阶问题: f(0)=1,f(1)=1,f(2)=2
- 斐波那契数列: f(0)=0,f(1)=1,f(2)=1
class Solution {
public:
int numWays(int n) {
if(n==0 || n==1) return 1;
int a=1,b=1,c=0;
for(int i=2;i<=n;++i){
c=(a+b)%1000000007;
a=b;
b=c;
}
return c;
}
};
扩展
1.一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶…也可以跳上n级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。
- 数学归纳法:f(n)=2^(n-1)
2.用8个21的小矩形无重叠地覆盖一个28的大矩形,总共有多少方法。
- 仍然是斐波那契数列