【PAT刷题甲级】1092.To Buy or Not to Buy

美人松的高度2

  返回  

剑指offer系列——剑指 Offer 10. 斐波那契数列与青蛙跳台阶问题(C语言)

2021/8/21 20:02:37 浏览:

⭐️前面的话⭐️

大家好!博主开辟了一个新的专栏——剑指offer,我要开始刷题了!这个专栏会介绍《剑指offer》书上所有的面试编程题。并且会分享一些我的刷题心得。由于博主水平有限,如有错误,欢迎指正,如果有更好的解题思路和算法可以分享给博主哦!一起加油!一起努力!

📒博客主页:未见花闻的博客主页
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
📌本文由未见花闻原创,CSDN首发!
✉️坚持和努力一定能换来诗与远方!
💭参考书籍:📚《剑指offer第1版》,📚《剑指offer第2版》
💬参考在线编程网站:🌐牛客网🌐力扣
🙏作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!
博主的码云gitee,平常博主写的程序代码都在里面。


问题导航

  • 剑指 Offer 10- I. 斐波那契数列
  • 剑指 Offer 10- II. 青蛙跳台阶问题


剑指 Offer 10- I. 斐波那契数列

⭐️剑指 Offer 10- I. 斐波那契数列⭐️

写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:
F(0) = 0, F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。

答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

💡示例:

输入:n = 2
输出:1
输入:n = 5
输出:5

💡限制:

0 <= n <= 100

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/fei-bo-na-qi-shu-lie-lcof

⭐️解题思路⭐️
使用编程解决斐波拉契数列问题或类似问题,一般有两种方法:
🔑递归法
🔑动态规划

如果使用递归法求斐波拉契数列数列的第n项,会存在大量的重复计算,导致消耗大量的时间和空间,当n越大所消耗的时间越长,且n到一定的值(如50)时,会明显感知程序运行所需的时间非常长,在力扣平台上使用递归的方法一定会超时,所以递归法在这里行不通。当然,当n较小时,还是可以使用递归法求斐波拉契数列的某项。
在这里插入图片描述

所以在这里将重点介绍使用动态规划的方法去求斐波拉契数列的第n项。
我们先可以使用一个变量an用来存变量a与变量b之和的值。对于这道题,可以初始化a=0 b=1分别对应斐波拉契数列数列的第0项,第1项。则第2项为an=a+b,再将a=b b=an,然后再进行an=a+b就能得到第3项,以此类推,就能得到斐波拉契数列的第n项,这种思想就是动态规划的思想。

但是要注意的是这道题返回的结果是需要小于1e9+7(1000000007),所以我们也不用担心整型溢出的问题,对an取模就可以了,即an=(a+b)%1000000007

时间复杂度:O(N)

编程语言:C语言
在线编程平台:力扣

int fib(int n){
    int a = 0;
    int b = 1;
    int an = 1;
    if (n <= 0)
    {
        return a;
    }
    else
    {
    while(n - 1)
    {
        an = (a + b) % 1000000007;//答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
        a = b;
        b = an;
        n--;
    }
    return an;
    }
}

1

剑指 Offer 10- II. 青蛙跳台阶问题

⭐️剑指 Offer 10- II. 青蛙跳台阶问题⭐️

一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。

答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

💡示例

输入:n = 2
输出:2
输入:n = 7
输出:21
输入:n = 0
输出:1

💡限制

0 <= n <= 100

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/qing-wa-tiao-tai-jie-wen-ti-lcof

⭐️解题思路⭐️
这道题就是斐波拉契数列的衍生,让我们分析分析:
1.当n=1的时,很明显青蛙只有一种跳法。
2.当n=2时,青蛙有两种选择,一是每次跳1级台阶,跳两次,二是直接跳两级台阶,一步到位。所以,一共有两种跳法。
3.当n>2时,我们不妨把上n级台阶的跳法记为一个函数f(n),青蛙在第一次跳的时候有两个选择,即跳一级台阶或跳两级台阶。当青蛙选择第一次跳一级台阶时,跳完后还剩n-1级台阶,在此情况下,跳法的数目为f(n-1);当青蛙选择第一次跳两级台阶时,跳完后还剩n-2级台阶,在此情况下,跳法数目为f(n-2)。所以,我们可以推出青蛙跳n级台阶的跳法总数为f(n)=f(n-1)+f(n-2)。

最终我们能得到一个与斐波拉契数列基本上一样的表达式f(n)=f(n-1)+f(n-2) 其中f(1)=1, f(2) = 2
采取的方法也就和斐波拉契数列一样,但是也要注意返回的结果需要小于1e9+7(1000000007)(题目要求)。

时间复杂度:O(N)

编程语言:C语言
在线编程平台:力扣

int numWays(int n){
    int a = 1;
    int b = 2;//f(n) = f(n-1) + f(n-2)
    int an = 2;
    if (n <= 1)
    {
        return a;
    }
    else
    {
        while(n - 2)
        {
            an = (a + b) % 1000000007;
            a = b;
            b = an;
            n--;
        }
        return an;
    }
}

2
进阶:若把条件修改成一次可以跳一级,也可以跳2级…也可以跳上n级呢?

当做一道思考题留给各位读者吧!

博主专门介绍过青蛙跳台阶问题哦!(点击下面蓝色的字体直达!)
青蛙为什么要跳台阶?C语言趣解青蛙跳台阶问题

觉得文章写得不错的老铁们,点赞评论关注走一波!谢谢啦!

联系我们

如果您对我们的服务有兴趣,请及时和我们联系!

服务热线:18288888888
座机:18288888888
传真:
邮箱:888888@qq.com
地址:郑州市文化路红专路93号