【剑指 Offer】10-I.斐波那契数列
题目描述
写一个函数,输入 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.斐波那契数列的更多相关文章
- 剑指offer七之斐波那契数列
一.题目 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项.n<=39. 二.思路 序号: 0 1 2 3 4 5 ...
- 剑指offer 07:斐波那契数列
题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0).(n<=39) 法一: public class Solution { publi ...
- 【剑指Offer】10- I. 斐波那契数列 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人微信公众号:负雪明烛 目录 题目描述 解题方法 递归 动态规划 日期 题目地址:htt ...
- 剑指offer-面试题9.斐波拉契数列
题目一:写一个函数,输入n,求斐波拉契数列的第n项. 斐波拉契数列的定义如下: { n=; f(n)={ n=; { f(n-)+f(n-) n>; 斐波拉契问题很明显我们会想到用递归来解决: ...
- 剑指offer-矩形覆盖-斐波那契数列(递归,递推)
class Solution { public: int rectCover(int number) { if(number==0 || number==1||number==2) return nu ...
- 剑指offer——面试题10:斐波那契数列
个人答案: #include"iostream" #include"stdio.h" #include"string.h" using na ...
- 剑指offer第二版面试题10:斐波那契数列(JAVA版)
题目:写一个函数,输入n,求斐波那契数列的第n项.斐波那契数列的定义如下: 1.效率很低效的解法,挑剔的面试官不会喜欢 使用递归实现: public class Fibonacci { public ...
- 剑指offer 面试题10:斐波那契数列
题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0).n<=39 编程思想 知道斐波拉契数列的规律即可. 编程实现 class Solu ...
- 【剑指offer】10A--求裴波那切数列的第n项,C++实现
#本文是牛客网<剑指offer>刷题笔记 1.题目 写入一个函数,输入n,输出裴波那切数列的第n项 2.思路 递归--时间和空间复杂度高 循环--时间和空间复杂度低,通过循环迭代计算第n项 ...
随机推荐
- css改变svg的颜色
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- ES6 代码转成 ES5 代码的实现思路是什么(来自github每日一题)
将代码字符串解析成抽象语法树,即所谓的 AST 对 AST 进行处理,在这个阶段可以对 ES6 代码进行相应转换,即转成 ES5 代码 根据处理后的 AST 再生成代码字符串 每日一题https:// ...
- 网络拓扑实例13:IPv4静态路由与NQA联动简介
组网图形 IPv4静态路由与NQA联动简介 网络质量分析NQA(Network Quality Analysis)是一种实时的网络性能探测和统计技术,可以对响应时间.网络抖动.丢包率等网络信息进行统计 ...
- jwt与springcloud联用
图片来源与博客:https://www.jianshu.com/p/99a458c62aa4 分布式权限管理参考:https://blog.csdn.net/qq_36236890/article/d ...
- Springboot mini - Solon详解(五)- Solon扩展机制之Solon Plugin
Springboot min -Solon 详解系列文章: Springboot mini - Solon详解(一)- 快速入门 Springboot mini - Solon详解(二)- Solon ...
- 22期老男孩Ptython全栈架构师视频教程
老男孩Ptython全栈架构师视频教程 Python最新整理完整版22期视频教程 超60G课程容量<ignore_js_op> <ignore_js_op> <ignor ...
- js上 七、表达式
(1).什么是表达式 任何有值的内容都是表达式 一个表达式会产生一个值,它可以放在任何需要一个值的地方,比如a=3中的3就是一个表达式,a=3整体也可以作为一个表达式. 常见表达式有如下几种: ü 原 ...
- 从苹果BigSur官网学点东西
从苹果BigSur官网学点东西 Awsome配色 这个 蓝紫渐变大底 + 简洁的 矩形状字块 + 粗细层次字形,看着就蛮舒服. 看看css配色: .section-hero div[data-comp ...
- phpstorm ext-json is missing in composer.json
- python多元回归于调用excel文件
import xlrd from numpy.linalg import inv import numpy as np data = xlrd.open_workbook(u'C:\\Users\\x ...