LeetCode 0873. Length of Longest Fibonacci Subsequence Solution in Java, C++, Python & More | Explanation + Code

CoderIndeed
0
0873. Length of Longest Fibonacci Subsequence

Description

A sequence x1, x2, ..., xn is Fibonacci-like if:

  • n >= 3
  • xi + xi+1 == xi+2 for all i + 2 <= n

Given a strictly increasing array arr of positive integers forming a sequence, return the length of the longest Fibonacci-like subsequence of arr. If one does not exist, return 0.

A subsequence is derived from another sequence arr by deleting any number of elements (including none) from arr, without changing the order of the remaining elements. For example, [3, 5, 8] is a subsequence of [3, 4, 5, 6, 7, 8].

 

Example 1:

Input: arr = [1,2,3,4,5,6,7,8]
Output: 5
Explanation: The longest subsequence that is fibonacci-like: [1,2,3,5,8].

Example 2:

Input: arr = [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].

 

Constraints:

  • 3 <= arr.length <= 1000
  • 1 <= arr[i] < arr[i + 1] <= 109

Solutions

Solution 1: Dynamic Programming

We define f[i][j] as the length of the longest Fibonacci-like subsequence, with arr[i] as the last element and arr[j] as the second to last element. Initially, for any i ∈ [0, n) and j ∈ [0, i), we have f[i][j] = 2. All other elements are 0.

We use a hash table d to record the indices of each element in the array arr.

Then, we can enumerate arr[i] and arr[j], where i ∈ [2, n) and j ∈ [1, i). Suppose the currently enumerated elements are arr[i] and arr[j], we can obtain arr[i] - arr[j], denoted as t. If t is in the array arr, and the index k of t satisfies k < j, then we can get a Fibonacci-like subsequence with arr[j] and arr[i] as the last two elements, and its length is f[i][j] = max(f[i][j], f[j][k] + 1). We can continuously update the value of f[i][j] in this way, and then update the answer.

After the enumeration ends, return the answer.

The time complexity is O(n2), and the space complexity is O(n2), where n is the length of the array arr.

PythonJavaC++GoTypeScriptRustJavaScript
class Solution: def lenLongestFibSubseq(self, arr: List[int]) -> int: n = len(arr) f = [[0] * n for _ in range(n)] d = {x: i for i, x in enumerate(arr)} for i in range(n): for j in range(i): f[i][j] = 2 ans = 0 for i in range(2, n): for j in range(1, i): t = arr[i] - arr[j] if t in d and (k := d[t]) < j: f[i][j] = max(f[i][j], f[j][k] + 1) ans = max(ans, f[i][j]) return ans(code-box)

Post a Comment

0Comments

Post a Comment (0)

#buttons=(Accept !) #days=(20)

Our website uses cookies to enhance your experience. Check Now
Accept !