#brute force #완전 탐색
점점 증가하는 양수의 숫자들(오름차순)로만 이루어진 배열 arr 이 있다. 이 배열의 부분 수열 중에 피보나치 숫자들로만 이루어진 가장 긴 수열의 길이를 반환해라.
만약 없다면 0 을 반환해라.
제한조건:
3 <= arr.length <= 10001 <= arr[i] < arr[i + 1] <= 109처음에 이 문제를 봤을 때는 당황해서 어떻게 풀지 생각이 안났다. 하지만, 천천히 생각해보면 꽤나 간단한 문제이다.
배열 arr 의 최대 길이가 1000 이므로 완전 탐색(여기서는 O(N^2))으로 문제를 풀 수 있다.
Set 에 넣어둔다.import java.util.*;
class Solution {
public int lenLongestFibSubseq(int[] arr) {
int n = arr.length;
Set<Integer> set = new HashSet<>();
for (int num : arr) {
set.add(num);
}
int answer = 0;
// 모든 가능한 두 수를 시작으로 시도
for (int i = 0; i < n; ++i) {
for (int j = i + 1; j < n; ++j) {
int x = arr[i], y = arr[j];
int length = 2;
// Fibonacci-like 조건: x + y가 존재하면 시퀀스를 확장
while (set.contains(x + y)) {
int z = x + y;
x = y;
y = z;
++length;
}
if (length >= 3) {
answer = Math.max(answer, length);
}
}
}
return answer;
}
}