剑指offer——斐波那契数列三连

题目

一、斐波那契数列

时间限制:1秒 空间限制:32768K 热度指数:615828
本题知识点: 递归
题目描述
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。
n<=39

  • 斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从1963年起出版了以《斐波纳契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。--------------百度百科

  • 想法很简单解释循环前两个相加等于现在求的,题目知识点写作递归,其实可以用循环

class Solution {
public:
    int Fibonacci(int n) {
        if (n == 0) return 0;
        int j = 1;//第一个斐波那契数
        int i = 1;//第二个
        while(--n)//直到n减完退出循环
        {
            i += j;//求Xn+1=Xn-1+Xn
            j = i - j;//保存Xn
        }
        return j;//返回Xn
    }
    
};

二、跳台阶

时间限制:1秒 空间限制:32768K 热度指数:468962
本题知识点: 递归
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。

  • 同上一道题目,这其实也是一道斐波那契数列的题
  • n=1时,f(1) = 1(只跳一格)
  • n=2时,f(2) = (直接跳两格)1 + f(1) = 2;
  • n=3时,f(3) = (直接跳两格+跳一格)2 + (只跳一格)f(1) = 3;
  • n=4时,f(4) = (22)1 + (21+12)3 + (14)1 = 5;
  • 最后你会求得规律F(n+1) = F(n) + F(n-1);
  • 所以最后可以看成是斐波那契数列
class Solution {
public:
    int Fibonacci(int n) {
        if (n == 0) return 0;
        int j = 1;//第一个斐波那契数
        int i = 2;//第二个
        while(--n)//直到n减完退出循环
        {
            i += j;//求Xn+1=Xn-1+Xn
            j = i - j;//保存Xn
        }
        return j;//返回Xn
    }
    
};

三、变态跳台阶

时间限制:1秒 空间限制:32768K 热度指数:378260
本题知识点: 贪心
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

  • 思路
  • n=1时,只能跳一级所以是1;F(1) = F(0) = 1
  • n=2时,跳两级和跳一级*2所以是2;F(2) = F(1) + F(0)
  • n=3时,跳三级,跳两级+跳一级,跳一级*3 = 4; F(3) = F(2) + F(1) + F(0)
  • n=4时,跳四级,跳三级+跳一级,跳两级2,跳两级+跳一级2,跳一级+4 = 8;F(4) = F(3) + F(2) + F(1) + F(0)
  • F(n) = F(n-1) + F(n-2)+…+F(n-n) = F(0) + F(1) + F(2) + F(3) + … + F(n-1)
  • F(n-1)表示n个台阶一次跳1格的次数
  • 所以F(n)可以看成是之前的所有元素相加+1得到 可以化为发F(n) = 2^(n-1);
class Solution {
public:
    int jumpFloorII(int number) {
        if(number == 0)return 0;
        return 1<<(number-1);//左移相当于2的n次
        
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值