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
浙公网安备 33010602011771号