Leetcode - Length of Longest Fibonacci Subsequence
https://leetcode.com/problems/length-of-longest-fibonacci-subsequence/
A sequence X_1, X_2, ..., X_n
is fibonacci-like if:
-
n >= 3
-
X_i + X_{i+1} = X_{i+2}
for alli + 2 <= n
Given a strictly increasing array A
of positive integers forming a sequence, find the length of the longest fibonacci-like subsequence of A
. If one does not exist, return 0.
(Recall that a subsequence is derived from another sequence A
by deleting any number of elements (including none) from A
, 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: [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: [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].
func lenLongestFibSubseq(A []int) int { if len(A) == 0 { return 0 } n := len(A) dp := make([][]int, n) max := 0 for i := 0; i < len(dp); i++ { dp[i] = make([]int, n) } dp[0][0] = 1 for i := 2; i < n; i++ { l := 0 r := i - 1 for l < r { sum := A[l] + A[r] if sum == A[i] { dp[r][i] = dp[l][r] + 1 if dp[r][i] > max { max = dp[r][i] } l++ r-- continue } if sum > A[i] { r-- } else { l++ } } } if max == 0 { return max } return max + 2 }