【DP】873。最長フィボナッチサブシーケンスの長さ

件名の説明:

場合シーケンス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で再現

おすすめ

転載: blog.csdn.net/weixin_33885676/article/details/91203972