LeetCode 509 斐波那契数

LeetCode链接
斐波那契数(通常用F(n)表示)的定义:

 F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2),n>1由斐波那契数构成的序列称为斐波那契数列,它由0,1开始(正宗的斐波那契数列应该是以1,1开始,没有F(0)这一项),之后的每一项都是前两项之和。

题目要求给定一个数n,计算F(n)的值。(0<=n<=30)

斐波那契数列因数学家莱昂纳多·斐波那契以兔子繁殖为例子而引入,故又称为“兔子数列”。
一般而言,兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。如果所有兔子都不死:
我们不妨拿新出生的一对小兔子分析一下:
第一个月小兔子没有繁殖能力,所以还是一对
两个月后,生下一对小兔对数共有两对
三个月以后,老兔子又生下一对,因为小兔子还没有繁殖能力,所以一共是三对
------
依次类推可以列出下表:

  所以能得出以下公式:

幼仔对数=前月成兔对数
成兔对数=前月成兔对数+前月幼仔对数=前月总体对数
总体对数=本月成兔对数+本月幼仔对数=前月总体对数+前月成兔对数=前月总体对数+前前月总体对数    //F(n)=F(n-1)+F(n-2)的来源
//希望这几个公式没有把你绕晕

方法一、递归

  斐波那契序列是典型的递归问题。除了头两项以外,其他F(n)的值取决于F(n-1),F(n-2)。而F(n-1),F(n-2)又取决于它们前两项的值,以此类推,在此我就不过多赘述。代码如下:

//递归
class Solution {public int fib(int n) {if(n<2) {return n;}return fib(n-1)+fib(n-2);}
}

方法二、动态规划

  递归的代码虽然简捷明了,看起来赏心悦目,但函数调用的次数很多,开销很大,而且它里面进行了很多重复计算。举个例子 ,如下图,计算F(9)时,F(7)要计算2次,F(6)要计算3次…n越大,重复计算的次数就越多,时间复杂度为O(2^n),指数爆炸,这并不可取。

  如果将每次计算的F(n)存起来,那么将会大大减少计算的次数,这就是动态规划的思想。状态转移方程就是F(n)=F(n-1)+F(n-2),边界条件就是F(0)=0,F(1)=1,用dp[n]存储F(n)。代码如下:

class Solution {public int fib(int n) {if(n<2) {return n;}int[] dp=new int[n+1];//边界条件,dp数组的初始化dp[0]=0;dp[1]=1;for(int i=2;i<=n;i++){dp[i]=dp[i-1]+dp[i-2];}return dp[n];}
}

因为最后结果只要求返回F(n),而F(n)只与F(n-1)、F(n-2)有关,所以,上面空间复杂度为O(n)的方法还可以优化,利用滚动数组的思想,用两个变量存储F(n-1)、F(n-2),将空间复杂度降为O(1)。代码如下:

//动态规划
class Solution {public int fib(int n) {if(n<2) {return n;}//p,q是边界F(0)、F(1)int p=0;int q=1;int res=0;for(int i=1;i<n;i++){res=p+q;p=q;q=res;}return res;}
}

方法三、公式法

  这里直接粘贴官方题解中有关公式法的介绍

  第一次看完我大受震憾,只能说自己实力不够还得好好学习吧。代码如下:

 class Solution {public int fib(int n) {double temp=Math.sqrt(5);double ans=(1/temp)*(Math.pow((1+temp)/2,n)-Math.pow((1-temp)/2,n));return (int)Math.round(ans);//round()函数参数为double型时,返回一个最接近该参数的long型数,参数为float型时,返回一个最接近的int值}}

类比

  该题与LeetCode 70 题 爬楼梯 LeetCode链接 十分相似。同时,LeetCode 剑指offer 10-I 斐波那契数列 LeetCode链接 中有当n很大时关于取模的处理,都可以尝试做一下。

斐波那契数列(Java语言)相关推荐

  1. 《LeetCode力扣练习》剑指 Offer 10- I. 斐波那契数列 Java

    <LeetCode力扣练习>剑指 Offer 10- I. 斐波那契数列 Java 一.资源 题目: 写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N) ...

  2. 兔子繁殖问题 斐波那契数列 java实现

    兔子繁殖问题 斐波那契数列 java实现 问题描述 一对兔子,从出生后第3个月起每个月都生一对兔子. 小兔子长到第3个月开始每个月又生一对兔子. 假如兔子都不死, 请问第1个月出生的一对兔子,第n个月 ...

  3. 斐波那契数列c语言程序改错题,C语言习题004:斐波那契数列

    C语言练习004:斐波那契数列 斐波那契数列是一种非常有意思的数列,由 0 和 1 开始,之后的斐波那契系数就由之前的两数相加.用数学公式定义斐波那契数列则可以看成如下形式: F0=0 F1=1 Fn ...

  4. 斐波那契数列112358c语言编程,c语言中的斐波那契数列

    本文概述 C中的斐波那契数列:对于斐波那契数列,下一个数字是前两个数字的和,例如0.1.1.2.3.5.8.13.21等.斐波那契数列的前两个数字为0和1. 编写fibonacci系列程序的方法有两种 ...

  5. 斐波那契数列112358c语言编程,C程序显示斐波那契数列

    C程序显示斐波那契数列 在此示例中,您将学习显示前n个数字的斐波那契数列(由用户输入). 要理解此示例,您应该了解以下C语言编程主题: 斐波那契数列是下一个项是前两个项之和的序列. 斐波那契数列的前两 ...

  6. 斐波拉契数列 Java三种实现

    对于很多Java初学者来说,求解斐波拉契数列,基本上所使用的方式都是递归.对于求解斐波拉契数列来说,递归的实现方式的效率是极其低下的. 在此,我贴出三种实现(递归,迭代,动态规划): 我们先看代码的执 ...

  7. 斐波拉契数列 java实现

    指的是这样一个数列: 1 1 2 3 5 8 13 21 34 ... F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*) 也称黄金分割数列,兔子数列 通项 ...

  8. 兔子繁殖问题(斐波那契数列c语言版)

    问题描述 兔子繁殖问题是一个经典的c语言问题,其大概内容如下: 著名意大利数学家Fibonacci曾提出一个问题:有一对小兔子,从出生后第3个月起每个月都生一对兔子.小兔子长到第3个月后每个月又生一对 ...

  9. 斐波那契数java实现_斐波那契数列Java实现[剑指offer]

    描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). n<=39 题解 1.递归实现 采用递归的方式进行实现时,从第n个节点向下递归时,存 ...

  10. 最长斐波那契数列java实现

    class Solution {public int lenLongestFibSubseq(int[] arr) {//建立一个二维数组来存储每一个以i为结尾元素,j为倒数第二个元素的斐波那契数列的 ...

最新文章

  1. golang var 初始化时机_你应该知道的 Go 调度器知识:Go 核心原理 — 协程调度时机...
  2. java同步锁实例_Java lock同步锁使用实例解析
  3. Python 爬虫进阶二之 PySpider 框架安装配置
  4. 青岛旅游学校计算机证书,【我和我的旅校】青岛旅游学校优秀毕业生郭千瑜
  5. HDU 1867 KMP
  6. mybatis中SqlSession一定要关闭
  7. 与context的关系_Android 一个进程有多少个 Context 对象(答对的不多)
  8. EvnetTimeWindow API
  9. 安卓软件改名器_安卓歌词适配V3.9.5 无损音乐下载器(软件篇)
  10. 摘自韩寒博客《砰然心动》
  11. 计算机光盘无法格式化,win10无法格式化dvd光盘
  12. SpringBoot线程池获取service实例空指针
  13. 解决:启动program时出现问题,找不到指定模块
  14. “菜鸟”程序员和“大神”程序员的差别竟然这么大...
  15. QtXlsx第三方库在Mac OS和Windows下的配置及简单使用
  16. 一加和小米哪个好 一加用技术领先树立起品牌典范
  17. 通过英文剧集、电影学单词的小工具
  18. 计算机最低配置有哪些,win10对电脑配置有哪些要求?win10最低配置要求
  19. elasticsearch DSL查询之should查询
  20. 2021-2027全球与中国汽车CMOS图像传感器市场现状及未来发展趋势

热门文章

  1. android+wear+和iphone,Android Wear手表兼容iPhone:和苹果抢用户
  2. JS添加获取Cookie
  3. directx学习之在屏幕上画一个三角形
  4. https://blog.csdn.net/qq_23589775/article/details/81143584
  5. 简单实现网页加载动画
  6. 一个牛人的经历---北京八年——从极度贫困到财务自由(转)
  7. java_入门基础笔记
  8. JavaScript 数组方法 遍历
  9. java excel 替换_Excel根据另一个工作表中的查找替换单元格值
  10. 前端微信小程序常见面试题