873. Length of Longest Fibonacci Subsequence

LeetCode

Approach 1: Brute Force with Set

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
// Iterative
class Solution {
public int lenLongestFibSubseq(int[] A) {
int len=A.length;
Set<Integer> set=new HashSet<>();
for(int i:A) set.add(i);

int ans=0;
for(int i=0;i<len;i++){
for(int j=i+1;j<len;j++){
int x=A[j],y=A[i]+A[j];
int length=2;
while(set.contains(y)){
int tmp=y;
y+=x;
x=tmp;
ans=Math.max(ans,++length);
}
}
}

return ans>2?ans:0;
}
}
/* Recursive
class Solution {
private int dfs(int i,int j,int len,Set<Integer> set){
if(!set.contains(i+j)) return 0;
return Math.max(len,dfs(j,i+j,len+1,set));
}

public int lenLongestFibSubseq(int[] A) {
int len=A.length;
Set<Integer> set=new HashSet<>();
for(int i:A) set.add(i);

int ans=0;
for(int i=0;i<len;i++){
for(int j=i+1;j<len;j++){
ans=Math.max(ans,dfs(A[i],A[j],3,set));
}
}

return ans>2?ans:0;
}
}*/

Approach 2: Dynamic Programming

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Solution {
public int lenLongestFibSubseq(int[] A) {
int len=A.length;
Map<Integer,Integer> index=new HashMap<>();
for(int i=0;i<len;i++) index.put(A[i],i);

Map<Integer,Integer> longest=new HashMap<>();
int ans=0;
for(int k=0;k<len;k++){
for(int j=0;j<k;j++){
int i=index.getOrDefault(A[k]-A[j],-1);
if(i>=0&&i<j){
longest.put(j*len+k,longest.getOrDefault(i*len+j,2)+1);
ans=Math.max(ans,longest.get(j*len+k));
}
}
}
return ans>=3?ans:0;
}
}

link
DP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// Time Complexity: O(N^2)
// Space Complexity: O(N^2)
class Solution {
public int lenLongestFibSubseq(int[] A) {
int n = A.length;
int max = 0;
int[][] dp = new int[n][n];
for (int i = 2; i < n; i++) {
int l = 0, r = i - 1;
while (l < r) {
int sum = A[l] + A[r];
if (sum > A[i]) {
r--;
} else if (sum < A[i]) {
l++;
} else {
dp[r][i] = dp[l][r] + 1;
max = Math.max(max, dp[r][i]);
r--;
l++;
}
}
}
return max == 0 ? 0 : max + 2;
}
}

0%