題目鏈接
難度:中等 ??????類型: 數(shù)組
如果序列 X_1, X_2, ..., X_n 滿足下列條件,就說它是 斐波那契式 的:
n >= 3
對(duì)于所有 i + 2 <= n,都有 X_i + X_{i+1} = X_{i+2}
給定一個(gè)嚴(yán)格遞增的正整數(shù)數(shù)組形成序列,找到 A 中最長(zhǎng)的斐波那契式的子序列的長(zhǎng)度。如果一個(gè)不存在,返回 0 。
(回想一下,子序列是從原序列 A 中派生出來的,它從 A 中刪掉任意數(shù)量的元素(也可以不刪),而不改變其余元素的順序。例如, [3, 5, 8] 是 [3, 4, 5, 6, 7, 8] 的一個(gè)子序列)
示例1
輸入: [1,2,3,4,5,6,7,8]
輸出: 5
解釋:
最長(zhǎng)的斐波那契式子序列為:[1,2,3,5,8] 。
示例2
輸入: [1,3,7,11,12,14,18]
輸出: 3
解釋:
最長(zhǎng)的斐波那契式子序列有:
[1,11,12],[3,11,14] 以及 [7,11,18] 。
解題思路
以每個(gè)數(shù)作為斐波那契序列的第一個(gè)數(shù)a,以它之后的每一個(gè)數(shù)都做第二個(gè)數(shù)b,尋找a+b是否在原數(shù)列中
若在,計(jì)數(shù)器加1,并令a= b, b=a+b,繼續(xù)判斷a+b是否在原數(shù)列中
若不在,結(jié)算當(dāng)前的長(zhǎng)度,與當(dāng)前的最大長(zhǎng)度比較,更新當(dāng)前最大長(zhǎng)度
代碼實(shí)現(xiàn)
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-2):
for j in range(i+1, n-1):
count = 2
a, b = A[i], A[j]
while a+b in s:
a, b = b, a+b
count += 1
res = max(res, count)
return res if res>2 else 0