一、题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
示例1:
输入:n = 2
输出:2
示例2:
输入:n = 7
输出:21
示例3:
输入:n = 0
输出:1
提示:
0<=n<=100
二、思路分析
注:思路分析中的一些内容和图片参考自力扣各位前辈的题解,感谢他们的无私奉献
思路
设跳上
n
级台阶有f(n)
种跳法。在所有跳法中,青蛙的最后一步只有两种情况:跳上1
级或2
级台阶。
当为1
级台阶:剩n-1
个台阶,此情况共有f(n-1)
种跳法
当为2
级台阶:剩n-2
个台阶,此情况共有f(n-2)
种跳法
f(n)
为以上两种情况之和,即f(n)=f(n-1)+f(n-2)
,以上递推性质为斐波那契数列。本题可转化为求斐波那契数列第n
项的值,唯一的不同在于起始数字不同。
青蛙跳台阶问题:f(0)=1,f(1)=1,f(2)=2
斐波那契数列问题:f(0)=0,f(1)=1,f(2)=1
复杂度分析:
时间复杂度 O ( N ) \rm{O(N)} O(N):计算f(n)
需循环n
次,每轮循环内计算操作使用O(1)
空间复杂度 O ( 1 ) \rm{O(1)} O(1):几个标志变量使用常数大小的额外空间
三、整体代码
整体代码如下
int numWays(int n){
int tmp;
int a = 1;
int b = 1;
for(int i = 0; i < n; i++){
tmp = (a + b) % 1000000007;
a = b;
b = tmp;
}
return a;
}
运行,测试通过