题目描述

写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项。斐波那契数列的定义如下:

F(0) = 0,   F(1) = 1

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

斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。

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

示例

说明

Java

public class Solution10 {
public static void main(String[] args) {
Solution10 s = new Solution10();
Solution so = s.new Solution();
long t1 = System.currentTimeMillis(); System.out.println(so.fib(20));
long t2 = System.currentTimeMillis();
System.out.println(t2- t1); System.out.println(so.fib2(20));
long t3 = System.currentTimeMillis();
System.out.println(t3- t2); System.out.println(so.fib3(20));
long t4 = System.currentTimeMillis();
System.out.println(t4- t3);
} /**
* 方法一:递归
* 把 f(n) 问题的计算拆分成 f(n-1) 和 f(n-2) 两个子问题的计算,并递归,以 f(0) 和 f(1) 为终止条件。
*
* 方法二:记忆化递归
* 在递归法的基础上,新建一个哈希表,用于在递归时存储 f(0) 至 f(n) 的数字值,重复遇到某数字则直接取用,避免了重复的递归计算。
*
* 方法三:动态规划
* 以斐波那契数列性质 f(n + 1) = f(n) + f(n - 1) 为转移方程。
*
*/
class Solution {
final int CONSTANT = 1000000007;
HashMap<Integer, Integer> map = new HashMap<>(); public int fib(int n) {
int first = 0, second = 1, sum;
for (int i = 0; i < n ; ++i) {
sum = (first + second) % CONSTANT;
first = second;
second = sum;
} return first;
} public int fib2(int n) {
if (n < 2) {
return n;
}
if (map.containsKey(n)) {
return map.get(n);
} int first = fib2(n - 1) % CONSTANT;
map.put(n - 1, first);
int second = fib2(n - 2) % CONSTANT;
map.put(n - 2, second);
int res = (first + second) % CONSTANT;
map.put(n, res); return res;
} public int fib3(int n) {
if (n < 2) {
return n;
} int first = (fib3(n - 1) % CONSTANT);
int second = (fib3(n - 2) % CONSTANT);
return (first + second) % CONSTANT;
}
}
}

C++


Python


总结

【剑指 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. 斐波那契数列 解题报告(Python & C++)

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

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

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

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

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

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

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

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

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

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

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

  9. 【剑指offer】10A--求裴波那切数列的第n项,C++实现

    #本文是牛客网<剑指offer>刷题笔记 1.题目 写入一个函数,输入n,输出裴波那切数列的第n项 2.思路 递归--时间和空间复杂度高 循环--时间和空间复杂度低,通过循环迭代计算第n项 ...

随机推荐

  1. js 实现字符串翻转

    字符串作在程序中是非常常见的,因为程序中绝大部分的数据都可以当作字符串来处理.在这里介绍几种翻转字符串的方法. (1)使用字符串函数 //使用数组翻转函数 function reverseString ...

  2. Java程序执行过程及内存机制

    本讲将介绍Java代码是如何一步步运行起来的,其中涉及的编译器,类加载器,字节码校验器,解释器和JIT编译器在整个过程中是发挥着怎样的作用.此外还会介绍Java程序所占用的内存是被如何管理的:堆.栈和 ...

  3. 七、TestNG传递参数2

    数据提供者本身可以接受两个类型的参数:Method和ITestContext 在创建@DataProvider方法是可以有四种格式如图: 第一种在上一篇中有学到 1-Methode参数使用 @Data ...

  4. ubuntu 18 安装xgboost GPU版本

    综合上述两个帖子: https://www.cnblogs.com/huadongw/p/6161145.html https://blog.csdn.net/u011587516/article/d ...

  5. hydra-microservice 中文手册(3W字预警)

    Hydras 是什么? Hydra 是一个 NodeJS 包(技术栈不是重点,思想!思想!思想!),它有助于构建分布式应用程序,比如微服务. Hydra 提供服务发现(service discover ...

  6. 2. 使用Shell能做什么

    批处理 在批处理的过程中,能够实现脚步自动化,比GUI自动化速度高效 日常工作场景 服务端测试 移动端测试 持续集成与自动化部署,这是最最场景的场景,可以说离开了shell,持续集成和自动化部署也会遇 ...

  7. Unity 游戏的暂停,继续,重开,退出

    1.暂停游戏.   Time.timeScale = 0;   2.继续游戏.   Time.timeScale = 1;   Time.timeScale = 0可以暂停游戏,Time.timeSc ...

  8. Python进阶——什么是描述符?

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 在 Python 开发中,你可能听说过「描述符」这个概念,由于我们很少直接使用它,所以大部分开发人员 ...

  9. SpringCloud 源码系列(5)—— 负载均衡 Ribbon(下)

    SpringCloud 源码系列(4)-- 负载均衡 Ribbon(上) SpringCloud 源码系列(5)-- 负载均衡 Ribbon(下) 五.Ribbon 核心接口 前面已经了解到 Ribb ...

  10. python序列(六)列表排序

    1.sort方法排序原址排序 list.sort(key=None,reverse=False(or True)) 当reverse=False时:为正向排序: 当reverse=True时:为反向排 ...