题目

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

思路1(递归 / 自顶向下)

  • 这题是很常见的一道入门递归题,可以采用自顶向下的递归方法,比如我们要求第n个位置的值,根据斐波那契数列的定义fib(n) = fib(n-1) + fib(n-2),即等于前一个和前前一个两个的值之和

  • 但是如果直接递归,会导致很多重复的计算,效率很低,比如 n 为 5 时:

    1. fib(5)fib(4)fib(3) 两个值之和

    2. 然后 fib(4) 又等于 fib(3)fib(2) 两个值之和。注意, fib(3) 在上一步已经求过了,这里还要再求一次

    3. 另一个 fib(3) 即为 fib(2)fib(1) 两个值之和,同样,fib(2),也被求过了

    4. ……

  • 根据上面例子我们可以发现这样子会导致很多多余的计算,做无用功,也会出现由于 n 的增大导致计算量急剧增大。因此我们可以将这个算法优化一下,就是添加一个表格 memory 来记录计算过的值,在每次递归的时候,判断一下之前是否计算过了,如果发现计算过了,直接返回数组中对应的值,否则就计算一下,然后记录到 memory 表格里

代码

  1. class Solution {
  2. int[] memory;
  3. public int fib(int n) {
  4. memory = new int[n+1];
  5. return help(n);
  6. }
  7. public int help(int n) {
  8. // 递归结束的条件
  9. if (n <= 1) {
  10. return n;
  11. }
  12. // 判断是否计算过了
  13. if (memory[n] != 0) {
  14. return memory[n];
  15. }
  16. // 没有在 memory 中找到就计算一下,然后在记录到 memory 中
  17. int i = help(n - 1) + help(n - 2);
  18. i %= 1000000007;
  19. memory[n] = i;
  20. return memory[n];
  21. }
  22. }

复杂度分析

  • 时间复杂度:\(O(N)\)
  • 空间复杂度:\(O(N)\)

思路2(迭代 / 动态规格)

  • 同样,根据斐波那契数列定义,可以发现第 n 个的值为前两个值之和,因此我们可以从第一个开始计算,循环计算到 n就得到了结果,空间上仅仅占两个变量的空间,为 \(O(1)\) ,代码如下:

代码

  1. class Solution {
  2. public int fib(int n) {
  3. if (n < 2) {
  4. return n;
  5. }
  6. int a = 1;
  7. int b = 1;
  8. for (int i = 2; i < n; i++) {
  9. int temp = (a + b);
  10. a = b;
  11. b = temp;
  12. b %= 1000000007;
  13. }
  14. return b;
  15. }
  16. }

复杂度分析

  • 时间复杂度:\(O(N)\)
  • 空间复杂度:\(O(1)\)

力扣 - 剑指 Offer 10- I. 斐波那契数列的更多相关文章

  1. 剑指offer七之斐波那契数列

    一.题目 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项.n<=39. 二.思路 序号:                  0  1   2   3  4   5  ...

  2. 剑指offer 07:斐波那契数列

    题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0).(n<=39) 法一: public class Solution { publi ...

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

    题目描述 写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项.斐波那契数列的定义如下: F(0) = 0,   F(1) = 1 F(N) = F(N - 1) + F(N - ...

  4. 【剑指Offer】10- I. 斐波那契数列 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人微信公众号:负雪明烛 目录 题目描述 解题方法 递归 动态规划 日期 题目地址:htt ...

  5. 剑指offer-面试题9.斐波拉契数列

    题目一:写一个函数,输入n,求斐波拉契数列的第n项. 斐波拉契数列的定义如下: { n=; f(n)={ n=; { f(n-)+f(n-) n>; 斐波拉契问题很明显我们会想到用递归来解决: ...

  6. 剑指offer-矩形覆盖-斐波那契数列(递归,递推)

    class Solution { public: int rectCover(int number) { if(number==0 || number==1||number==2) return nu ...

  7. 剑指offer——面试题10:斐波那契数列

    个人答案: #include"iostream" #include"stdio.h" #include"string.h" using na ...

  8. 剑指offer第二版面试题10:斐波那契数列(JAVA版)

    题目:写一个函数,输入n,求斐波那契数列的第n项.斐波那契数列的定义如下: 1.效率很低效的解法,挑剔的面试官不会喜欢 使用递归实现: public class Fibonacci { public ...

  9. 剑指offer 面试题10:斐波那契数列

    题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0).n<=39 编程思想 知道斐波拉契数列的规律即可. 编程实现 class Solu ...

随机推荐

  1. pycharm上的python虚拟环境移到离线机器上

    Pycharm的Terminal 中执行: 查看现有的包到requirements.txt中 pip freeze > requirements.txt 生成依赖包 D:\machangwei\ ...

  2. 互联网公司作息表「GitHub 热点速览 v.21.42」

    作者:HelloGitHub-小鱼干 检测一家公司是否值得一去,除了高薪之外,还有时薪的算法.即便是同样的时薪,在一家能随时摸鱼的公司,岂不是人生快事.WorkingTime 便是上周很火的互联网作息 ...

  3. javascript-jquery介绍

    jquery优势 1.轻量级 2.强大的选择器 3.出色的DOM封装 4.可靠的事件处理机制 5.完善的Ajax 6.不污染顶级变量 7.出色的浏览器兼容 8.链式操作方式 9.隐式迭代 10.行为层 ...

  4. 【UE4 C++ 基础知识】<7> 容器——TSet

    概述 TSet是一种快速容器类,(通常)用于在排序不重要的情况下存储唯一元素. TSet 类似于 TMap 和 TMultiMap,但有一个重要区别:TSet 是通过对元素求值的可覆盖函数,使用数据值 ...

  5. 力扣 - 剑指 Offer 57. 和为s的两个数字

    题目 剑指 Offer 57. 和为s的两个数字 思路1(哈希表) 这题首先想到的是使用两个for遍历,查找是哪两个相加等于target,但是时间复杂度确实\(O(N^2)\),时间复杂度太高,因此我 ...

  6. Python AttributeError: module 'string' has no attribute 'atoi'

    python2 中可以用string.atoi 在python3中会报错 替换的方案是 string.atoi(your_str) 替换为 int(your_str) 这个代码python2和pyth ...

  7. candy leetcode C++

    There are N children standing in a line. Each child is assigned a rating value. You are giving candi ...

  8. hdu 2200 Eddy's AC难题(简单数学。。)

    题意: N个人,每个人AC的题数都不一样. Eddy想从中选出一部分人(或者全部)分成两组.必须满足第一组中的最小AC数大于第二组中的最大AC数. 问共有多少种不同的选择方案. 思路: 简单数学.. ...

  9. 使用NLog把日志写入数据库并按天自动分表

    前言 最近用Asp.net Core开发程序的时候 因为时间的关系,就没有过多的去关注日志方面的功能 都是直接用系统的ILogger先记录着,然后看日志的时候就先在命令行看日志 在开发阶段没有什么问题 ...

  10. vscode + vim 全键盘操作高效搭配方案

    基础知识 vscode-vim vscode-vim是一款vim模拟器,它将vim的大部分功能都集成在了vscode中,你可以将它理解为一个嵌套在vscode中的vim. 由于该vim是被模拟的的非真 ...