016-力扣刷题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
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution(object):
    def lenLongestFibSubseq(self, A):
        """
        :type A: List[int]
        :rtype: int
        """
        s=set(A)  #set以后是一个集合,去掉重复的元素
        n=len(A) #n是A的长度
        result=0
        #下面开始遍历
     #   [1,2,3,4,5,6,7]#要进行两个for循环进行组合
         # 首选第一个循环取出第一位,第二个循环取出后面的所有的元素 进行不同的组合前两个数 1,2   1,3   1,4   1,5    1,6  2,3    2,4  .....
        #取出前两位后计算后面的结果判断是不是在剩下的元素串中 S
        for i in range(n-1):  #要留出一位给第二个元素
            for j in range(i+1,n): #这里要注意是i+1
                a,b=A[i],A[j] #取出两个元素赋给a,b
                count = 2 #只要是取出两个值说面最少也得有两个数
                #下面开始循环计算判断下面的结果是不是在s中
                while a+b in s: #只要计算出的结果在s中那么继续循环
                    a,b=b,a+b  #继续向下迭代
                    count+=1 #个数加1
                    result =max(count,result) #每次保存的都是结果最大的
        return result if result > 0 else 0   #返回最终的计算结果  这里这么写是因为只有n>=3才能组成序列否则的话就返回0