LeetCode剑指 Offer II 093 最长斐波那契数列

LeetCode剑指 Offer II 093 最长斐波那契数列

class Solution:
    def lenLongestFibSubseq(self, arr: List[int]) -> int:

        n, loc, ans = len(arr), {}, 0
        for i in range(n): loc[arr[i]] = i
        f = [[0] * n for i in range(n)]

        for i in range(n):
            for j in range(i - 1, -1, -1):
                if arr[j] * 2 <= arr[i]: break
                else:
                    arr_k = arr[i] - arr[j]
                    if arr_k in loc:
                        k = loc[arr_k]
                        f[i][j] = max(f[j][k] + 1, 3)
                        ans = max(ans, f[i][j])
        
        return ans

暴搜 + 剪枝

class Solution:
    def lenLongestFibSubseq(self, arr: List[int]) -> int:

        n, loc = len(arr), {}
        for i in range(n):
            if arr[i] in loc: loc[arr[i]] += 1
            else: loc[arr[i]] = 1
        
        ans = 0
        for i in range(n):
            for j in range(i + 1, n):
                if ((arr[j] - arr[i]) in loc) and (arr[j] - arr[i]) < arr[i]: continue
                cnt, l, r = 0, arr[i], arr[j]
                while (l + r) in loc:
                    cnt, l, r = cnt + 1, r, l + r
                # print(arr[i], arr[j], cnt)
                ans = max(ans, cnt)
        ans = 0 if ans == 0 else ans + 2
        return ans

posted on 2022-09-30 17:12  solvit  阅读(37)  评论(0)    收藏  举报

导航