【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)的更多相关文章

  1. LeetCode 873. Length of Longest Fibonacci Subsequence

    原题链接在这里:https://leetcode.com/problems/length-of-longest-fibonacci-subsequence/ 题目: A sequence X_1, X ...

  2. 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 ...

  3. 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 ...

  4. 【LeetCode】673. Number of Longest Increasing Subsequence 解题报告(Python)

    [LeetCode]673. Number of Longest Increasing Subsequence 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https:/ ...

  5. 【LeetCode】300. Longest Increasing Subsequence 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  6. Lintcode:Longest Common Subsequence 解题报告

    Longest Common Subsequence 原题链接:http://lintcode.com/zh-cn/problem/longest-common-subsequence/ Given ...

  7. [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 ...

  8. 【LeetCode】594. Longest Harmonious Subsequence 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 统计次数 日期 题目地址:https://leetc ...

  9. [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 ...

随机推荐

  1. 从零构建Java项目(Maven+SpringBoot+Git) #02 奥斯丁项目

    前两天我说要写个项目来持续迭代,有好多小伙伴都表示支持和鼓励,项目的第一篇这不就来了么~我给项目取了个名字,英文名叫做:austin,中文名叫做:奥斯丁 名字倒没有什么特别的含义,我单纯觉得这个名字好 ...

  2. IPFS是什么?IPFS原理、IPFS存储

    以下内容调研截止到2021/11/5日 IPFS简介 IPFS是一种内容可寻址.点对点.分布式文件系统.IPFS采用内容-地址寻址技术,即通过文件内容进行检索而不是通过文件的网络地址.简单来说,就是对 ...

  3. abandon, aboard, abolish

    abandon Abandon is a 2002 American psychological thriller drama film [惊悚片] ... Waiting for Handler o ...

  4. 打破砂锅问到底!HTTP和HTTPS详解

    HTTP 引自维基百科HTTP:超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式.协作式和超媒体信息系统的应用层协议.HTTP是万维网的数 ...

  5. 案例分析 CAN OPEN 调试记录 进度

    2020.12.29 发现一片博客:https://blog.csdn.net/harrycomeon/article/details/94650103 需要一个硬件:CAN分析仪,网上200元左右. ...

  6. Bootstrap-table动态表格

    在开发中遇到一个需要动态生成table的需求,包括表头和数据.在调试的过程中遇到很多问题,包括数据分页,解决之后记录一下. 如下代码的数据加载流程: ①表头是动态的,在初始化table之前需要调一次后 ...

  7. d3 CSS

    CSS的inline.block与inline-block 块级元素(block):独占一行,对宽高的属性值生效:如果不给宽度,块级元素就默认为浏览器的宽度,即就是100%宽. 行内元素(inline ...

  8. vue实现input输入框的模糊查询

     最近在用uni-app做一个项目,使用的框架还是vue,想了好久才做出来 . HTML代码部分 <input type="text" focus class="s ...

  9. 使用wesocket从 rabbitMQ获取实时数据

    rabbitmq支持stomp组件,通过stomp组件和websocket可以从rabbitMQ获取实时数据.这里分享一个demo: 使用时需要引入的js ,用到了sock.js和stomp.js & ...

  10. KubeCon 2021|使用 eBPF 代替 iptables 优化服务网格数据面性能

    作者 刘旭,腾讯云高级工程师,专注容器云原生领域,有多年大规模 Kubernetes 集群管理及微服务治理经验,现负责腾讯云服务网格 TCM 数据面产品架构设计和研发工作. 引言 目前以 Istio[ ...