【剑指 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项 ...
随机推荐
- python web的一些常见技术面试笔试题
1. 三次握手四次挥手 tcp建立连接的过程是三次挥手,断开连接是4次挥手. 三次握手:建立连接时 a. 客户端发送syn=1 seq=k给服务器 b. 服务器接收到之后知道有客户端想建立连接, ...
- CF1416D Graph and Queries
本题解用于作者加深算法印象,也欢迎各位的阅读. 题目大意 给你一张无向图,并给你两种操作: \(1~v\) :找到当前点 \(v\) 所在的联通块内权值最大的点,输出该点权值并将其权值改为 \(0\) ...
- 【学习笔记】使用 bitset 求解较高维偏序问题
求解五维偏序 给定 \(n(\le 3\times 10^4)\) 个五元组,对于每个五元组 \((a_i, b_i, c_i, d_i, e_i)\),求存在多少个 \(1\le j\le n\) ...
- MySQL的验证方式
mysql8之后root用户的密码验证方式修改了,mysql8的加密方式为caching_sha2_passoword,而navicat连接所用的方式为native_password. 使用命令mys ...
- (原创)docker18.03的安装
简要说明:docker的安装,官方主要是分为 1.在线yum命令安装: 2.离线安装: 3.安装指定的版本. 备注:官方的安装考虑的是全球区域,说白了就是大陆有一些不能照搬.所以这篇文章我是自己考虑实 ...
- webstorm2017.02版本如何使用material theme
本想废话一番,表达对material theme的喜欢.还是直接说方法吧~ file-settings-Plugins-Browse repositories-搜索 material theme -选 ...
- STL——容器(Set & multiset) insert 的返回值 和 pair 的用法
1. 使用 insert 插入时的返回值: 将一个元素插入 (insert) 到 set 或 multiset 中时,如果插入失败返回的类型是一个 pair 的自定类型,insert 源码如下: in ...
- 马赛克密码破解——GitHub 热点速览 Vol.50
作者:HelloGitHub-小鱼干 "xx"(爆粗口) 这个词是最能体现本人看到本周 GitHub 热点的心情的.那一天,看到用图片处理技术还原马赛克密码的 Depix 便惊为天 ...
- 基于nacos注册中心的ribbon定制规则
前面说到基于nacos的注册发现有可以扩展实现我们自己的负载均衡算法(Nacos数据模型),来实现同集群调用,是基于spring.cloud.nacos.discovery.cluster-name参 ...
- [从源码学设计]蚂蚁金服SOFARegistry之时间轮的使用
[从源码学设计]蚂蚁金服SOFARegistry之时间轮的使用 目录 [从源码学设计]蚂蚁金服SOFARegistry之时间轮的使用 0x00 摘要 0x01 业务领域 1.1 应用场景 0x02 定 ...