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. Window10安装linux子系统及子系统安装1Panel面板

    原文地址:Window10安装linux子系统及子系统安装1Panel面板 - Stars-One的杂货小窝 最近看到halo博客发布了2.10.0,终于是新增了个备份功能,于是有了念头想要升级下 但 ...

  2. 【Unity3D】消融特效

    1 前言 ​ 选中物体消融特效中基于 Shader 实现了消融特效,本文将基于 Shader Graph 实现消融特效,两者原理一样,只是表达方式不同,另外,选中物体消融特效中通过 discard 丢 ...

  3. 深入理解 Python 虚拟机:协程初探——不过是生成器而已

    深入理解 Python 虚拟机:协程初探--不过是生成器而已 在 Python 3.4 Python 引入了一个非常有用的特性--协程,在后续的 Python 版本当中不断的进行优化和改进,引入了新的 ...

  4. LVS负载均衡群集——其一

    LVS负载均衡群集 一.LVS简介 LVS(Linux Virtual Server)即Linux虚拟服务器,是由章文嵩博士主导的开源负载均衡项目,目前LVS已经被集成到Linux内核模块中.该项目在 ...

  5. 提升运维效率:轻松掌握JumpServer安装和使用技巧

    前言 JumpServer 是一个开源的跳板机的解决方案,提供了对远程服务器的安全访问.会话录制和审计.用户身份管理等功能,适用于需要管理机器资源&大量服务器资源的情况. 本文将在分享 doc ...

  6. 动态规划——提高Ⅴ(DP优化)

    单调队列优化DP 其实单调队列就是一种队列内的元素有单调性(单调递增或者单调递减)的队列,答案(也就是最优解)就存在队首,而队尾则是最后进队的元素.因为其单调性所以经常会被用来维护区间最值或者降低DP ...

  7. Leetcode回文数

    直接上python代码 class Solution: def isPalindrome(self, x: int) -> bool: if x<0: //负数必不是回文数 return ...

  8. 在ASP.NET Core 中使用 .NET Aspire 消息传递组件

    前言 云原生应用程序通常需要可扩展的消息传递解决方案,以提供消息队列.主题和订阅等功能..NET Aspire 组件简化了连接到各种消息传递提供程序(例如 Azure 服务总线)的过程.在本教程中,小 ...

  9. 线上ES集群参数配置引起的业务异常案例分析

    作者:vivo 互联网数据库团队- Liu Huang 本文介绍了一次排查Elasticsearch node_concurrent_recoveries 引发的性能问题的过程. 一.故障描述 1.1 ...

  10. 汇报工作与众不同:在PPT中展示Datainside动态图表

    题目要求了解在PPT中展示Datainside动态图表,下面是关于该主题的详细介绍. 内容可视化:概念与定义 内容可视化(Data Visualization)是将数据以图形或其他视觉形式呈现的过程, ...