【LeetCode】873. Length of Longest Fibonacci Subsequence 解题报告(Python)
【LeetCode】873. Length of Longest Fibonacci Subsequence 解题报告(Python)
标签(空格分隔): LeetCode
作者: 负雪明烛
id: fuxuemingzhu
个人博客: http://fuxuemingzhu.cn/
题目地址:https://leetcode.com/problems/length-of-longest-fibonacci-subsequence/description/
题目描述:
A sequence X_1, X_2, …, X_n is fibonacci-like if:
- n >= 3
- X_i + X_{i+1} = X_{i+2} for all i + 2 <= n
Given a strictly increasing array A of positive integers forming a sequence, find the length of the longest fibonacci-like subsequence of A. If one does not exist, return 0.
(Recall that a subsequence is derived from another sequence A by deleting any number of elements (including none) from A, without changing the order of the remaining elements. For example, [3, 5, 8] is a subsequence of [3, 4, 5, 6, 7, 8].)
Example 1:
Input: [1,2,3,4,5,6,7,8]
Output: 5
Explanation:
The longest subsequence that is fibonacci-like: [1,2,3,5,8].
Example 2:
Input: [1,3,7,11,12,14,18]
Output: 3
Explanation:
The longest subsequence that is fibonacci-like:
[1,11,12], [3,11,14] or [7,11,18].
Note:
- 3 <= A.length <= 1000
- 1 <= A[0] < A[1] < … < A[A.length - 1] <= 10^9
- (The time limit has been reduced by 50% for submissions in Java, C, and C++.)
题目大意
找出一个严格递增的数组中最长的费布拉奇子序列长度。注意子序列可以不连续,而子数组必须连续。
解题方法
使用最简单的方法竟然也能过。只需要双重循环,循环的含义是找出以这两个元素为起始点的费布拉奇数列。然后继续向后面遍历,使用set用O(1)的时间复杂度来查找下面的一个费布拉奇数字是否在set之中,然后继续再找下一个费布拉奇数字即可。
费布拉奇数字计算的时间复杂度接近于O(logM),M代表数组A中的最大值。所以整个时间复杂度是O(n^2 * longM)。
代码如下:
class Solution(object):
def lenLongestFibSubseq(self, A):
"""
:type A: List[int]
:rtype: int
"""
s = set(A)
n = len(A)
res = 0
for i in range(n - 1):
for j in range(i + 1, n):
a, b = A[i], A[j]
count = 2
while a + b in s:
a, b = b, a + b
count += 1
res = max(res, count)
return res if res > 2 else 0
方法二:
DP.
使用一维DP解决不了这个问题,因为一维DP只保存了到某个为止的最长费布拉奇数列,但是新的数字到来之后能不能满足之前的费布拉奇数列是未知的。所以使用二维DP.
这个DP[i][j]数组的含义是,以i和j为结尾两个数字的费布拉奇数列长度(i < j)。因此,转移方程可以这么写:
dp[j][k] = dp[i][j] + 1
条件是 A[i] + A[j] = A[k]。
我们求解的过程是用j,k去遍历,然后查找满足条件的i。
使用字典保存每个数字和其下标的对应值,能用O(1)的时间复杂度求出i。
题目要求的结果是整个dp的最大值。
另外,如果出现A[i] >= A[j]直接break内层循环,因为我们指定了i < j。
这个题和一般dp不同的是,普通的dp的下标转移方程是固定的,而这个题需要我们先找出之前的i坐标,然后才去更新dp值。
这个算法的时间复杂度是O(n^2),空间复杂度是O(n^2).
class Solution(object):
def lenLongestFibSubseq(self, A):
"""
:type A: List[int]
:rtype: int
"""
n = len(A)
m = dict()
for i, a in enumerate(A):
m[a] = i
res = 0
# dp[i][j] := max len of seq ends with A[i], A[j]
dp = [[2 for i in range(n)] for j in range(n)]
for j in range(n):
for k in range(j + 1, n):
a_i = A[k] - A[j]
if a_i >= A[j]:
break
if a_i in m:
i = m[a_i]
dp[j][k] = dp[i][j] + 1
res = max(res, dp[j][k])
return res
参考资料:
https://leetcode.com/problems/length-of-longest-fibonacci-subsequence/discuss/152343/C++JavaPython-Check-Pair
https://zxi.mytechroad.com/blog/dynamic-programming/leetcode-873-length-of-longest-fibonacci-subsequence/
日期
2018 年 9 月 15 日 ———— 天气转冷,小心着凉
【LeetCode】873. Length of Longest Fibonacci Subsequence 解题报告(Python)的更多相关文章
- LeetCode 873. Length of Longest Fibonacci Subsequence
原题链接在这里:https://leetcode.com/problems/length-of-longest-fibonacci-subsequence/ 题目: A sequence X_1, X ...
- LC 873. Length of Longest Fibonacci Subsequence
A sequence X_1, X_2, ..., X_n is fibonacci-like if: n >= 3 X_i + X_{i+1} = X_{i+2} for all i + 2 ...
- 873. Length of Longest Fibonacci Subsequence
A sequence X_1, X_2, ..., X_n is fibonacci-like if: n >= 3 X_i + X_{i+1} = X_{i+2} for all i + 2 ...
- 【LeetCode】673. Number of Longest Increasing Subsequence 解题报告(Python)
[LeetCode]673. Number of Longest Increasing Subsequence 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https:/ ...
- 【LeetCode】300. Longest Increasing Subsequence 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- Lintcode:Longest Common Subsequence 解题报告
Longest Common Subsequence 原题链接:http://lintcode.com/zh-cn/problem/longest-common-subsequence/ Given ...
- [LeetCode] Length of Longest Fibonacci Subsequence 最长的斐波那契序列长度
A sequence X_1, X_2, ..., X_n is fibonacci-like if: n >= 3 X_i + X_{i+1} = X_{i+2} for all i + 2 ...
- 【LeetCode】594. Longest Harmonious Subsequence 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 统计次数 日期 题目地址:https://leetc ...
- [Swift]LeetCode873. 最长的斐波那契子序列的长度 | Length of Longest Fibonacci Subsequence
A sequence X_1, X_2, ..., X_n is fibonacci-like if: n >= 3 X_i + X_{i+1} = X_{i+2} for all i + 2 ...
随机推荐
- Linux之crond任务调度
1. 示意图 2. 基本语法 crontab [选项] # -e : 编辑crontab定时任务 # -l : 查询crontab # -r : 删除当前用户所有的crontab任务 # 例子: # ...
- kubernetes部署 flannel网络组件
创建 flannel 证书和私钥flannel 从 etcd 集群存取网段分配信息,而 etcd 集群启用了双向 x509 证书认证,所以需要为 flanneld 生成证书和私钥. cat > ...
- 初学者如何吃透一个Java项目
不少初学者朋友在学习Java过程中,会对着视频敲Java项目,其中遇到的BUG还能解决,但就是每次敲完一个项目,就感觉很空虚,项目里面的知识点感觉懂了但又好像没懂 这些朋友应该怎样才能掌握一个项目所用 ...
- Go语言核心36讲(Go语言实战与应用二十二)--学习笔记
44 | 使用os包中的API (上) 我们今天要讲的是os代码包中的 API.这个代码包可以让我们拥有操控计算机操作系统的能力. 前导内容:os 包中的 API 这个代码包提供的都是平台不相关的 A ...
- 14 - springboot的@Configuration、@Bean、@Import()、@ImportResource()、@Conditional说明
1.@Configuration.@Bean.@Import().@ImportResource().@Conditional 分析源码的时候总会见到标题中的这几个注解,因此:弄一篇博客来说明一下吧, ...
- ssm框架整合 — 更新完毕
1.spring整合mybatis 数据表自行搭建 ,我的结构如下: 1).导入依赖 <!-- spring整合mybatis的依赖 --> <!-- 1.spring需要的依赖 - ...
- 巩固javaweb的第十九天
巩固内容: 使用 form 元素 使用 form 元素封装要提交的信息 要向服务器提交信息,需要使用 form 元素,所有要提交的信息都应该在 form 内部.在 注册界面中,所有要输入的信息都位于 ...
- nodeJs-Stream接口
JavaScript 标准参考教程(alpha) 草稿二:Node.js Stream接口 GitHub TOP Stream接口 来自<JavaScript 标准参考教程(alpha)> ...
- Oracle中的null与空字符串''的区别
含义解释:问:什么是NULL?答:在我们不知道具体有什么数据的时候,也即未知,可以用NULL,我们称它为空,ORACLE中,含有空值的表列长度为零.ORACLE允许任何一种数据类型的字段为空,除了以下 ...
- Java 设计模式--策略模式,枚举+工厂方法实现
如果项目中的一个页面跳转功能存在10个以上的if else判断,想要做一下整改 一.什么是策略模式 策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理,最终可以实现解决 ...