斐波那契数Fibonacci
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的更多相关文章
- [Swift]LeetCode509. 斐波那契数 | Fibonacci Number
The Fibonacci numbers, commonly denoted F(n) form a sequence, called the Fibonacci sequence, such th ...
- Project Euler 104:Pandigital Fibonacci ends 两端为全数字的斐波那契数
Pandigital Fibonacci ends The Fibonacci sequence is defined by the recurrence relation: F[n] = F[n-1 ...
- 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]. 即计算大斐波那契数再取模. 一开始看到大斐波那契数,就想到了矩阵 ...
- DP:斐波纳契数
题目:输出第 n 个斐波纳契数(Fibonacci) 方法一.简单递归 这个就不说了,小n怡情,大n伤身啊……当n=40的时候,就明显感觉到卡了,不是一般的慢. //输出第n个 Fibonacci 数 ...
- python实现斐波那契数列(Fibonacci sequence)
使用Python实现斐波那契数列(Fibonacci sequence) 斐波那契数列形如 1,1,2,3,5,8,13,等等.也就是说,下一个值是序列中前两个值之和.写一个函数,给定N,返回第N个斐 ...
- 斐波那契堆(Fibonacci heap)原理详解(附java代码实现)
前言 斐波那契堆(Fibonacci heap)是计算机科学中最小堆有序树的集合.它和二项式堆有类似的性质,但比二项式堆有更好的均摊时间.堆的名字来源于斐波那契数,它常用于分析运行时间. 堆结构介绍 ...
- 算法笔记_001:斐波那契数的多种解法(Java)
本篇文章解决的问题来源于算法设计与分析课程的课堂作业,主要是运用多种方法来计算斐波那契数.具体问题及解法如下: 一.问题1: 问题描述:利用迭代算法寻找不超过编程环境能够支持的最大整数的斐波那契数是第 ...
- hdu1568&&hdu3117 求斐波那契数前四位和后四位
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1568 题意:如标题所示,求斐波那契数前四位,不足四位直接输出答案 斐波那契数列通式: 当n<=2 ...
- golang 斐波那契数
golang 斐波那契数 package main import "fmt" /* 斐波那契数,亦称之为斐波那契数列(意大利语: Successione di Fibonacci) ...
- 用x种方式求第n项斐波那契数,99%的人只会第一种
大家好啊,我们又见面了.听说有人想学数据结构与算法却不知道从何下手?那你就认真看完本篇文章,或许能从中找到方法与技巧. 本期我们就从斐波那契数列的几种解法入手,感受算法的强大与奥妙吧. 原文链 ...
随机推荐
- Android news Display Owner Info on Your Android Device in Case It Gets Lost
Display Owner Info on Your Android Device in Case It Gets Lost The latest versions of Android includ ...
- Interesting Array 题解
Interesting Array 题目大意 构造一个序列 \(a\),使其满足若干限制条件,每个限制条件是形如 l r q 的式子,其意义是:\(\&_{i=l}^ra_i=q\). 题意分 ...
- 长程 Transformer 模型
Tay 等人的 Efficient Transformers taxonomy from Efficient Transformers: a Survey 论文 本文由 Teven Le Scao.P ...
- 在不知带头节点地址的情况下删除和插入一个p指针指向的节点总结
在不知带头节点地址的情况下删除和插入一个p指针指向的节点总结 (p指向的不是第一个,也不是最后一个)A->B->C *p->B 插入(在p结点之前插入q) 解析: 直接往p前插入q, ...
- [vue]精宏技术部试用期学习笔记 II
精宏技术部试用期学习笔记(vue) router : vue的模拟路由 前置准备 安装 vue-router pnpm i vue-router@4 //安装版本4的 vue-router 可以在 p ...
- [Python急救站课程]整数数列求和
整数数列求和程序: n = input("请输入整数N: ") sum = 0 for i in range(int(n)): # range用于计数整数.for表示循环 sum ...
- ORACLE 视图合并SQL优化案例
朋友给了一条SQL说跑8个小时才出结果,结果集很小75条数据,给他安排一下. SQL如下: SELECT DISTINCT T.XLA_TYPE, T.XLA_CODE, T.VENDOR_CODE, ...
- [SWPUCTF 2021 新生赛]非常简单的逻辑题
一道简单的代码逆向,根据提供的py代码写出逆向代码,没怎么做过这种题开始没什么思路,原来直接暴力就好 直接写出暴力代码
- 视觉BEV基本原理和方案解析
BEV(Bird's-Eye-View)是一种鸟瞰视图的传感器数据表示方法,它的相关技术在自动驾驶领域已经成了"标配",纷纷在新能源汽车.芯片设计等行业相继量产落地.BEV同样在高 ...
- Android 锁屏时的生命周期
锁定屏幕前,应用被打开:onCreate->onStart->onResume 此时按下电源键,锁定屏幕:onPause->onStop 解锁屏幕,重新回到应用:onRestart- ...