件名の説明:
場合シーケンスX_1、X_2は、...、x_nに関するフィボナッチのようです:
- N> = 3
- X_I + X_ {I + 1} = X_ {I + 2}の全てのi + 2 <= N
シーケンスを形成する正の整数の厳密に増加配列Aを考えると、1が存在しない場合はA.の最長フィボナッチのようなサブシーケンスの長さを見つけ、0を返します。
(リコールは、サブシーケンスは、残りの要素の順序を変更することなく、Aからどれ含まない任意の数の要素()を削除することにより、別のシーケンスAから誘導される。例えば、[3、5、8]、[3のサブシーケンスであります4、5、6、7、8])。
例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].
例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].
問題解決のアイデア:
この質問は最長フィボナッチ数列、実践を求めています。
- 2つのサイクルのために、最初の2つの数字は、第一及び第二フィボナッチを得ました。
- これら二つの数(第3の数)第3のアレイかどうかを分析します。
- 3番目の配列の場合、さらに、数3が不可欠更新される前に3つのフィボナッチ数:
first = second, second = third, third = first + second
長さプラス1、そして決定を続行するために戻って行きます。 - 最大長の配列、更新値から第三の場合。
注:プログラミングする場合、SETのセットにアレイが、第3の時間複雑度はO(1)と判定されることができます。
時間計算量はO((N ^ 2)*関数logm)であり、第3サイクルからMのログは、アレイかどうかが決定される;空間複雑度は、O(N)、すなわち、オープンコレクションセットによって占有サイズ。
達成のpython3:
class Solution:
def lenLongestFibSubseq(self, A: List[int]) -> int:
setA = set(A)
ans = 0
for i in range(len(A)):
for j in range(i+1, len(A)):
first, second = A[i], A[j]
third = first + second
length = 2
while third in setA: # 当 third 在数组中,更新三个值继续判断
length += 1
first = second
second = third
third = first + second
ans = max(ans, length) # 更新最大长度
return ans if ans >= 3 else 0
ます。https://www.jianshu.com/p/8cabab3a1919で再現