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)

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

迭代(Iterative)

  1. // 时间复杂度 n ,空间复杂度 1
  2. class Solution {
  3. public int fib(int N) {
  4. if (N <= 1) return N;
  5. int a = 0, b = 1;
  6. while (N -- > 1) {
  7. int sum = a + b;
  8. a = b;
  9. b = sum;
  10. }
  11. return b;
  12. }
  13. }

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

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

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

  1. //时间复杂度n,空间复杂度n
  2. class Solution {
  3. public int fib(int N) {
  4. if (N<=1) return N;
  5. return memoize(N);
  6. }
  7. public int memoize(int n){
  8. int[] cache = new int[n+1];
  9. cache[1] = 1;
  10. for (int i=2;i <= n;i++) {
  11. cache[i] = cache[i-1] + cache [i-2];
  12. }
  13. return cache[n];
  14. }
  15. }

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

solution1

  1. //时间复杂度为 O(n^2 log M)
  2. class Solution {
  3. public int lenLongestFibSubseq(int[] A) {
  4. Set<Integer> s = new HashSet();
  5. for (int i : A) s.add(i);
  6. int len = A.length, ans = 0;
  7. for (int i = 0; i < len; i++){
  8. for (int j = i + 1; j < len; j++){
  9. int a = A[j], b = A[i] + A[j];
  10. if (b > A[len-1]) break;
  11. int count = 2;
  12. while(s.contains(b)){
  13. int temp = b;
  14. b += a;
  15. a = temp;
  16. ans = Math.max(ans,++count);
  17. }
  18. }
  19. }
  20. return ans >= 3 ? ans:0;
  21. }
  22. }

solution2

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

斐波那契数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. 在Docker下一键安装部署免费开源的问答社区!

    在Docker下一键安装部署免费开源的问答社区!   1.准备一台VPS主机,没有的话,[搞一台] 2.一键安装部署Docker wget https://raw.githubusercontent. ...

  2. 如何在 Ubuntu上使用snap安装Docker

    1 检查系统版本 具有sudo或root用户权限 2 安装 SNAP ctrl+alt+T 打开终端 运行以下命令以安装 SNAP sudo apt update sudo apt install s ...

  3. js数据结构--数组

    <!DOCTYPE html> <html> <head> <title></title> </head> <body&g ...

  4. RSA总结 From La神

    常用工具 分解大素数 factordb (http://www.factordb.com / API: http://factordb.com/api?query=) yafu (p q 相差过大或过 ...

  5. 在centos7上使用 docker安装mongodb挂载宿主机以及创建其数据库的用户名和密码(最新版本)

    前言 因为博主在使用docker安装mongodb并挂载时,发现在网上搜了好多都是以前版本的mongodb,并且按照他们操作总是在进入mongodb出问题,博主搞了好久终于弄好了,故写下博客,供有需要 ...

  6. MacOS X终端里SSH会话管理

    http://codelife.me/blog/2012/09/01/ssh-session-profile-management-in-terminal-of-macos-x/ 本文介绍如何在终端里 ...

  7. Null return value from advice does not match primitive return type for

    1.org.springframework.aop.AopInvocationException:Null return value from advice does not match primit ...

  8. SHA256算法加密工具类

    代码如下,请自取 /** * @description: SHA256算法加密 * @author: luolei * @Date: 2022-10-31 17:16 */ public class ...

  9. Kafka 如何保证消息消费的全局顺序性

    哈喽大家好,我是咸鱼 今天我们继续来讲一讲 Kafka 当有消息被生产出来的时候,如果没有指定分区或者指定 key ,那么消费会按照[轮询]的方式均匀地分配到所有可用分区中,但不一定按照分区顺序来分配 ...

  10. 地图选择器datav怎么使用?

    DataV 是一款基于阿里云的数据可视化产品,它提供了丰富的组件和功能,其中包括地图选择器.下面是一个详细的介绍: 1. 了解 DataV: - DataV 是一款强大的数据可视化工具,能够帮助用户将 ...