• 问题描述:

    斐波那契数,通常用 F(n) 表示,形成的序列称为斐波那契数列。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:

    F(0) = 0,   F(1) = 1
    F(N) = F(N - 1) + F(N - 2), 其中 N > 1.

    给定 N,计算 F(N)。

    示例 :

    输入:2
    输出:1
    解释:F(2) = F(1) + F(0) = 1 + 0 = 1.
  • 问题分析:

    由于计算任何一个第n(n >= 2)项的数都需要知道其前面两个数,即需要知道n-1和n-2是多少,然后两个相加得到结果,但是问题来了,要知道n-1,就要需要知道n-2,要知道n-2就需要知道n-3,会一直这样的循环递归下去,一直到第一个数,第二个,第三个.......再反推回来。 那就很明显了,大家第一时间想到的方法便是递归,就下来实现一下:

    方法一:递归实现

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

​ 问题分析:

​ 先看一下递归图:

​ 由于很多数的计算都要重复很多次,效率并不高,时间复杂度达到了 O(2^n),是斐波那契数计算中 时间复杂度最大,最不可取的方法。

​ 空间复杂度:O(n),堆栈中需要的空间与 N 成正比,堆栈会跟踪 fib(n) 的调用,随着堆栈的不断增长 如果没有足够的内存则会出现StackOverflowError异常。

​ 注:定义为int型时,最大只能求到n = 46,f(46) = 1836311903, 而 f(47) = -1323752223,因为超出了int 型数值的最大范围。

  • 算法改进:

    使用递归的同时,使用记忆化方式存储已经计算过的数据,减少不必要的重复计算,可以使时间复杂度降到 O(N),同时空间复杂度也是O(N)。具体的实现是使用一个数组,把每次计算过的值都存储进去,当再次使用这个数的时候,直接返回,不需要再进行递归。

    方法二:记忆化自底向上递归

    public class Solution {
    public int fib(int n) {
    if(n <= 1){
    return n;
    }
    int[] memo = new int[n+1];
    memo[1] = 1;
    for(int i = 2;i <= n; i++){
    //自底向上填充数组,一直到需要的那个数
    memo[i] = memo[i-1] + memo[i-2];
    }
    return memo[n];
    }
    }

方法三:使用第三方变量

class Solution {
public int fib(int N) {
if (N < 2) return N;
if (N == 2) return 1; int temp = 1;
int result = 1;
for (int i = 3; i <= N ; i++) {
result= temp + result;
temp = result - temp;
}
return result;
}
}

时间复杂度瞬间降到O(1),这个我觉得应该是三个方法里面最简单最高效的。


  • 最后:

    限于水平有限,斐波那契数的实现还有很多种方法,不能一一列举,当其中大部分都有类似的思想。

    水文中如有不准确或是错误之处,还望指出。谢谢~~~

    下一篇:LeetCode.62——不同路径

LeetCode.509——斐波那契数的更多相关文章

  1. Java实现 LeetCode 509 斐波那契数

    509. 斐波那契数 斐波那契数,通常用 F(n) 表示,形成的序列称为斐波那契数列.该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和.也就是: F(0) = 0, F(1) = 1 ...

  2. leetcode 509. 斐波那契数

    问题描述 斐波那契数,通常用 F(n) 表示,形成的序列称为斐波那契数列.该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和.也就是: F(0) = 0,   F(1) = 1 F(N) ...

  3. 力扣(LeetCode) 509. 斐波那契数

    斐波那契数,通常用 F(n) 表示,形成的序列称为斐波那契数列.该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和.也就是: F(0) = 0, F(1) = 1 F(N) = F(N ...

  4. 【LeetCode】509. 斐波那契数

    题目 斐波那契数,通常用 F(n) 表示,形成的序列称为斐波那契数列.该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和.也就是: F(0) = 0,   F(1) = 1 F(N) = ...

  5. leetcode 509斐波那契数列

    递归方法: 时间O(2^n),空间O(logn) class Solution { public: int fib(int N) { ?N:fib(N-)+fib(N-); } }; 递归+记忆化搜索 ...

  6. LeetCode_509.斐波那契数

    LeetCode-cn_509 509.斐波那契数 斐波那契数,通常用 F(n) 表示,形成的序列称为斐波那契数列.该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和.也就是: F(0) ...

  7. LeetCode(509. 斐波那数)

    问题描述: 斐波那契数,通常用 F(n) 表示,形成的序列称为斐波那契数列.该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和.也就是: F(0) = 0, F(1) = 1 F(N) ...

  8. [Swift]LeetCode509. 斐波那契数 | Fibonacci Number

    The Fibonacci numbers, commonly denoted F(n) form a sequence, called the Fibonacci sequence, such th ...

  9. UVA 11582 Colossal Fibonacci Numbers! 大斐波那契数

    大致题意:输入两个非负整数a,b和正整数n.计算f(a^b)%n.其中f[0]=f[1]=1, f[i+2]=f[i+1]+f[i]. 即计算大斐波那契数再取模. 一开始看到大斐波那契数,就想到了矩阵 ...

随机推荐

  1. oracle中使用pl/sql进行的文件读写操作

    第一次知道,可以使用pl/sql来进行文件的读写操作,嘿嘿,简单的试了下可行. 基本步骤如下: SQL> conn sys/sys@orcl as sysdba 已连接. SQL> cre ...

  2. 还看不懂同事代码?快来补一波 Java 7 语法特性

    前言 Java 平台自出现到目前为止,已经 20 多个年头了,这 20 多年间 Java 也一直作为最流行的程序设计语言之一,不断面临着其他新兴编程语言的挑战与冲击.Java 语言是一种静态强类型语言 ...

  3. Win10系统下应用窗口任务栏居中效果

    实现步骤: 在资源管理器中新建文件夹,一定要保证文件夹内无任何文件 任务栏上鼠标右键,移动到工具栏上,选择新建工具栏 选择新建的空文件夹 空文件夹出现在任务栏后,鼠标可以拖动工具栏前的两条竖线(图片上 ...

  4. PHP 转化 Excel导入时间

    $fixation = 25569; $fixationT = 24 * 60 * 60; $date = gmdate('Y-m-d H:i:s', ('excel导入的时间'- $fixation ...

  5. Java并发-几种常见的锁

    这几天在忙着投提前批内推,前面看的好多东西没有总结,正好这两天补上顺带复习一下 synchronized:Java之重型锁

  6. Java和PHP加解密

    PHP代码 <?php //DES加解密工具 class DesEncrypt { var $key; var $iv; function DesEncrypt($key, $iv=0) { $ ...

  7. a:visited不起作用的原因解析

    目前大多数的网站都很少会出现"一个超链接被点击后改变其颜色"的需求,但也还是有一部分网站有这样的实际需求,也是为了能够让用户更容易区分哪些标题是被点击访问过了,这类需求大多在新闻类 ...

  8. RTC时间设置

    1.命令行输入date,查看系统时间. 2.命令行输入 date -s "2019-01-21 16:03:00" 修改系统时间. 3.命令行输入 hwclock -w 将修改后的 ...

  9. Nhibernate的Session和StatelessSession性能比较

    Nhibernate的Session和StatelessSession性能比较 作者:Jesai 一个月入30K的大神有一天跟我说:我当年在你现在这个阶段,还在吊儿郎当呢!所以你努力吧! 有时候,一个 ...

  10. [题解]CSP2019 Solution - Part A

    至于为什么是 \(\text{Part A}\) 而不是 \(\text{Day 1}\) 那是因为 Day1 T3 还没改 (那这六题的 \(\text{solution}\) 就按难度顺序写吧) ...