873. 最长的斐波那契子序列的长度

exiaohu 于 2022-07-09 发布

题目链接:873. 最长的斐波那契子序列的长度

考虑到给定序列是严格递增的,而一个序列的下一个状态只跟这个序列的最后的两个元素有关。

因此记录每个数对 0 <= i < j < len(arr) 的最长的斐波那契子序列的长度。

在查找一个已有数对 (i, j) 的下一个索引时,反向查找,通过查找 arr[j] - arr[i] 是否在序列的前方来减少时间复杂度。

from collections import defaultdict
from typing import List


class Solution:
    def lenLongestFibSubseq(self, arr: List[int]) -> int:
        lens, idx, max_len = defaultdict(lambda: 2), {v: i for i, v in enumerate(arr)}, 0

        for j in range(2, len(arr)):
            for i in range(1, j):
                k = arr[j] - arr[i]
                if k in idx and idx[k] < i and lens[(idx[k], i)] + 1 > lens[(i, j)]:
                    lens[(i, j)], max_len = lens[(idx[k], i)] + 1
                    max_len = max(max_len, lens[(i, j)])
        return max_len