509. 斐波那契数

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

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

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

给定 N,计算 F(N)。

示例 1:

输入:2

输出:1

解释:F(2) = F(1) + F(0) = 1 + 0 = 1.

示例 2:

输入:3

输出:2

解释:F(3) = F(2) + F(1) = 1 + 1 = 2.

示例 3:

输入:4

输出:3

解释:F(4) = F(3) + F(2) = 2 + 1 = 3.

提示:

0 ≤ N ≤ 30

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/fibonacci-number

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

递归解法(Recursive)

// 时间复杂度 2^n,空间复杂度n
class Solution {
public int fib(int N) {
if (N < 2) return N;
return fib(N - 1) + fib(N - 2);
}
}

迭代(Iterative)

// 时间复杂度 n ,空间复杂度 1
class Solution {
public int fib(int N) {
if (N <= 1) return N;
int a = 0, b = 1;
while (N -- > 1) {
int sum = a + b;
a = b;
b = sum;
}
return b;
}
}

由顶到下,递归(Dynamic Programming - Top Down Approach)

// 时间复杂度降为n,空间为n
class Solution {
int[] cache = new int[31];
public int fib(int N) {
if (N <= 1) return N;
else if ( cache[N] != 0) return cache[N];
else return cache[N] = fib(N - 1) + fib(N - 2);
}
}

由下到上,计算到要求的值(Dynamic Programming - Bottom Up Approach)

//时间复杂度n,空间复杂度n
class Solution {
public int fib(int N) {
if (N<=1) return N;
return memoize(N);
}
public int memoize(int n){
int[] cache = new int[n+1];
cache[1] = 1;
for (int i=2;i <= n;i++) {
cache[i] = cache[i-1] + cache [i-2];
}
return cache[n];
}
}

873. 最长的斐波那契子序列的长度

如果序列 X_1, X_2, ..., X_n 满足下列条件,就说它是 斐波那契式 的:

n >= 3

对于所有 i + 2 <= n,都有 X_i + X_{i+1} = X_{i+2}

给定一个严格递增的正整数数组形成序列,找到 A 中最长的斐波那契式的子序列的长度。如果一个不存在,返回 0 。

(回想一下,子序列是从原序列 A 中派生出来的,它从 A 中删掉任意数量的元素(也可以不删),而不改变其余元素的顺序。例如, [3, 5, 8] 是 [3, 4, 5, 6, 7, 8] 的一个子序列)

示例 1:

输入: [1,2,3,4,5,6,7,8]

输出: 5

解释:

最长的斐波那契式子序列为:[1,2,3,5,8] 。

示例 2:

输入: [1,3,7,11,12,14,18]

输出: 3

解释:

最长的斐波那契式子序列有:

[1,11,12],[3,11,14] 以及 [7,11,18] 。

提示:

3 <= A.length <= 1000

1 <= A[0] < A[1] < ... < A[A.length - 1] <= 10^9

(对于以 Java,C,C++,以及 C# 的提交,时间限制被减少了 50%

思路

//思路1:两遍正序遍历+二分查找(或set)时间为O(N^2logN)
//不能用二分查找,需要找到两数之和之后循环查找,所以用HashSet //思路2:动态规划,倒着推,状态转移方程最后第三个数到最大序列等于第二个加1
//再用hashMap存数据的,value为保存数据的索引,方便longest通过索引确定保存最大值的key

solution1

//时间复杂度为 O(n^2 log M)
class Solution {
public int lenLongestFibSubseq(int[] A) {
Set<Integer> s = new HashSet();
for (int i : A) s.add(i);
int len = A.length, ans = 0; for (int i = 0; i < len; i++){
for (int j = i + 1; j < len; j++){
int a = A[j], b = A[i] + A[j];
if (b > A[len-1]) break;
int count = 2;
while(s.contains(b)){
int temp = b;
b += a;
a = temp;
ans = Math.max(ans,++count);
} }
}
return ans >= 3 ? ans:0;
}
}

solution2

class Solution {
public int lenLongestFibSubseq(int[] A) {
Map<Integer,Integer> map = new HashMap();//保存原数组
Map<Integer,Integer> longest = new HashMap();//保存最大子序列,(k,i,j)key=k*len+i
int len = A.length, ans = 0; for (int i = 0; i < len; ++i)
map.put(A[i], i);
for (int i = 0; i < len - 1; i++){
for (int j = i + 1; j < len; j++){
int mapk = A[j] - A[i];
int k = map.getOrDefault(A[j] - A[i], -1); //用map.get同时判断是否存在的一种方式
if (k >= 0 && k < i){
int count = longest.getOrDefault(k*len+i,2) + 1;//获取值默认为2,再加1
longest.put(i*len+j,count);
ans = Math.max(ans, count);
} }
}
return ans >= 3 ? ans:0;
}
}

斐波那契数Fibonacci的更多相关文章

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

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

  2. Project Euler 104:Pandigital Fibonacci ends 两端为全数字的斐波那契数

    Pandigital Fibonacci ends The Fibonacci sequence is defined by the recurrence relation: F[n] = F[n-1 ...

  3. 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]. 即计算大斐波那契数再取模. 一开始看到大斐波那契数,就想到了矩阵 ...

  4. DP:斐波纳契数

    题目:输出第 n 个斐波纳契数(Fibonacci) 方法一.简单递归 这个就不说了,小n怡情,大n伤身啊……当n=40的时候,就明显感觉到卡了,不是一般的慢. //输出第n个 Fibonacci 数 ...

  5. python实现斐波那契数列(Fibonacci sequence)

    使用Python实现斐波那契数列(Fibonacci sequence) 斐波那契数列形如 1,1,2,3,5,8,13,等等.也就是说,下一个值是序列中前两个值之和.写一个函数,给定N,返回第N个斐 ...

  6. 斐波那契堆(Fibonacci heap)原理详解(附java代码实现)

    前言 斐波那契堆(Fibonacci heap)是计算机科学中最小堆有序树的集合.它和二项式堆有类似的性质,但比二项式堆有更好的均摊时间.堆的名字来源于斐波那契数,它常用于分析运行时间. 堆结构介绍 ...

  7. 算法笔记_001:斐波那契数的多种解法(Java)

    本篇文章解决的问题来源于算法设计与分析课程的课堂作业,主要是运用多种方法来计算斐波那契数.具体问题及解法如下: 一.问题1: 问题描述:利用迭代算法寻找不超过编程环境能够支持的最大整数的斐波那契数是第 ...

  8. hdu1568&&hdu3117 求斐波那契数前四位和后四位

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1568 题意:如标题所示,求斐波那契数前四位,不足四位直接输出答案 斐波那契数列通式: 当n<=2 ...

  9. golang 斐波那契数

    golang 斐波那契数 package main import "fmt" /* 斐波那契数,亦称之为斐波那契数列(意大利语: Successione di Fibonacci) ...

  10. 用x种方式求第n项斐波那契数,99%的人只会第一种

    大家好啊,我们又见面了.听说有人想学数据结构与算法却不知道从何下手?那你就认真看完本篇文章,或许能从中找到方法与技巧.     本期我们就从斐波那契数列的几种解法入手,感受算法的强大与奥妙吧. 原文链 ...

随机推荐

  1. Util应用框架Web Api开发环境搭建

    要使用Util应用框架开发项目,首先需要搭建合适的开发环境. 迈出第一步,对于很多.Net新人可能并不简单. 如果你对.Net环境并不熟悉,请尽量按照本文档进行操作. 操作系统 请安装 Windows ...

  2. C#桶排序算法

    前言 桶排序是一种线性时间复杂度的排序算法,它将待排序的数据分到有限数量的桶中,每个桶再进行单独排序,最后将所有桶中的数据按顺序依次取出,即可得到排序结果. 实现原理 首先根据待排序数据,确定需要的桶 ...

  3. 文心一言 VS 讯飞星火 VS chatgpt (118)-- 算法导论10.3 3题

    三.用go语言,在ALLOCATE-OBJECT和 FREE-OBJECT过程的实现中,为什么不需要设置或重置对象的 prev 属性呢? 文心一言: 在 Go 语言中,ALLOCATE-OBJECT ...

  4. 虹科案例 | 石油天然气行业CFD高性能计算解决方案

    公司简介 DNV GL 是全球领先的能源.石油和海事行业风险管理及资产绩效提升的软件供应商,主要为客户提供全面的风险管理和各类评估认证服务,认证涉及信息通信技术.汽车及航空天.食品与饮料.医疗等方面. ...

  5. RLChina2022公开课-博弈论

    纯博弈: 单纯的动机组合,离散的集合 混合博弈: 加入了概率论,以百分比的概率执行不同的的动机.,概率分布 零和博弈.合作博弈.协同博弈 扩展博弈和非完美信息 扩展博弈.贝叶斯博弈 纳什均衡 任何一位 ...

  6. P7073 [CSP-J2020] 表达式

    Problem 考察算法:后缀表达式建树,优化. 题目简述 读入一个后缀表达式,由 \(\&,\mid,!\) 三种运算和操作数构成. 有 \(q\) 次询问,每次输入一个下标 \(i\) , ...

  7. shell解析xml文档

    需要解析的源文件: /tmp/cameralist : <?xml version="1.0" encoding="UTF-8"?><came ...

  8. Session入门实例

    session对象(是JSP的9大内置对象之一): (1)session代表一次用户会话:从客户端浏览器连接服务器开始,到客户端浏览器与服务器断开为止,这个过程就是一次会话. (2)session作用 ...

  9. CSS 样式书写顺序及规范

    作者:WangMin 格言:努力做好自己喜欢的每一件事 在项目中,大部分前端程序员都没有按照良好的CSS书写规范来写CSS代码,每次写css样式都是用到什么就在样式表后添加什么,完全没有考虑到样式属性 ...

  10. Shader学习笔记 (一) :利用shader在一个面绘制出圆

    在各种游戏中,想必大家一定和我一样总是惊叹于游戏画面的各种炫酷的特效. 作为游戏开发中单独列出的一个职业TA(Technology Art),他们会利用GLSL或者HLSL等着色器语言绘制出一幅幅美丽 ...