题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
示例 1:
输入:n = 2
输出:2
示例 2:
输入:n = 7
输出:21
提示:
0 <= n <= 100
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/qing-wa-tiao-tai-jie-wen-ti-lcof
解题思路
自顶向下分析,由于一次只能跳1级台阶或者2级台阶,因此青蛙跳到第n级之前要么在第n-1级台阶上,要么在第n-2级台阶上,若跳上n级台阶的跳法为f(n),则f(n) = f(n-1) + f(n-2);
自底向上分析,只有1级台阶时,有1种跳法;有2级台阶时,有2种跳法(2次各跳1级,一次跳2级);有3级台阶时,有3种跳法(从第1级跳2级直接到第3级,从第2级跳1级到第3级);以此类推......这就是斐波那契数列的应用。
代码
int numWays(int n){
int simp_ways[2] = {1, 1};
int waysn = 0, way1 = 1, way2 = 1;
if(n < 2)
{
return simp_ways[n];
}
for (int i = 2; i <= n; i++)
{
waysn = (way1 + way2) % 1000000007;
way1 = way2;
way2 = waysn;
}
return waysn;
}
测试代码及结果
#include<stdio.h>
int main(void)
{
// 功能测试
printf("n = 5: %d\n", numWays(5));
printf("n = 10: %d\n", numWays(10));
// 边界值测试
printf("n = 0: %d\n", numWays(0));
printf("n = 1: %d\n", numWays(1));
printf("n = 2: %d\n", numWays(2));
// 性能测试
printf("n = 2: %d\n", numWays(50));
printf("n = 2: %d\n", numWays(100));
}

执行结果
时间复杂度:O(n),空间复杂度:O(1)。

网友评论