# Length of longest Fibonacci subarray formed by removing only one element

Given an array A containing integers, the task is to find the length of longest Fibonacci subarray formed by removing only one element from the array.

Examples:

Input: arr[] = { 2, 8, 5, 7, 3, 5, 7 }
Output: 5
Explanation:
If we remove the number 7 at index 3, then the remaining array contains a Fibonacci subarray {2, 8, 5, 3, 5} of length 5, which is maximum.

Input: arr[] = { 2, 3, 6, 1 }
Output: 3
Explanation:
If we remove the number 6 at index 2, then the remaining array contains a Fibonacci subarray {2, 3, 1} of length 3, which is maximum.

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

Approach: The above-mentioned problem can be solved by counting the contiguous Fibonacci numbers just before every index and just after every index.

1. Now traverse the array again and find an index for which counts of Fibonacci numbers after and before is maximum.
2. In order to check for Fibonacci numbers, we will build a hash table containing all the Fibonacci numbers less than or equal to the maximum value in the array to test a number in O(1) time.

Below is the implementation of the above approach:

 `// C++ program to find length of the longest ` `// subarray with all fibonacci numbers ` ` `  `#include ` `using` `namespace` `std; ` `#define N 100000 ` ` `  `// Function to create hash table ` `// to check for Fibonacci numbers ` `void` `createHash(set<``int``>& hash, ` `                ``int` `maxElement) ` `{ ` ` `  `    ``// Insert first two fibnonacci numbers ` `    ``int` `prev = 0, curr = 1; ` ` `  `    ``hash.insert(prev); ` `    ``hash.insert(curr); ` ` `  `    ``while` `(curr <= maxElement) { ` ` `  `        ``// Summation of last two numbers ` `        ``int` `temp = curr + prev; ` ` `  `        ``hash.insert(temp); ` ` `  `        ``// Update the variable each time ` `        ``prev = curr; ` `        ``curr = temp; ` `    ``} ` `} ` ` `  `// Function to find the ` `// longest fibonacci subarray ` `int` `longestFibSubarray( ` `    ``int` `arr[], ``int` `n) ` `{ ` ` `  `    ``// Find maximum value in the array ` `    ``int` `max_val ` `        ``= *max_element(arr, arr + n); ` ` `  `    ``// Creating a set ` `    ``// containing Fibonacci numbers ` `    ``set<``int``> hash; ` ` `  `    ``createHash(hash, max_val); ` ` `  `    ``int` `left[n], right[n]; ` `    ``int` `fibcount = 0, res = -1; ` ` `  `    ``// Left array is used to count number of ` `    ``// continuous fibonacci numbers starting ` `    ``// from left of current element ` `    ``for` `(``int` `i = 0; i < n; i++) { ` ` `  `        ``left[i] = fibcount; ` ` `  `        ``// Check if current element ` `        ``// is a fibonacci number ` `        ``if` `(hash.find(arr[i]) ` `            ``!= hash.end()) { ` `            ``fibcount++; ` `        ``} ` ` `  `        ``else` `            ``fibcount = 0; ` `    ``} ` ` `  `    ``// Right array is used to count number of ` `    ``// continuous fibonacci numbers starting ` `    ``// from right of current element ` `    ``fibcount = 0; ` ` `  `    ``for` `(``int` `i = n - 1; i >= 0; i--) { ` ` `  `        ``right[i] = fibcount; ` ` `  `        ``// Check if current element ` `        ``// is a fibonacci number ` `        ``if` `(hash.find(arr[i]) ` `            ``!= hash.end()) { ` `            ``fibcount++; ` `        ``} ` `        ``else` `            ``fibcount = 0; ` `    ``} ` ` `  `    ``for` `(``int` `i = 0; i < n; i++) ` `        ``res = max( ` `            ``res, ` `            ``left[i] + right[i]); ` ` `  `    ``return` `res; ` `} ` ` `  `// Driver code ` `int` `main() ` `{ ` ` `  `    ``int` `arr[] = { 2, 8, 5, 7, 3, 5, 7 }; ` `    ``int` `n = ``sizeof``(arr) / ``sizeof``(arr); ` ` `  `    ``cout << longestFibSubarray(arr, n) ` `         ``<< endl; ` ` `  `    ``return` `0; ` `} `

 `// Java program to find length of the longest ` `// subarray with all fibonacci numbers ` `import` `java.util.*; ` ` `  `class` `GFG{ ` `static` `final` `int` `N = ``100000``; ` `  `  `// Function to create hash table ` `// to check for Fibonacci numbers ` `static` `void` `createHash(HashSet hash, ` `                ``int` `maxElement) ` `{ ` `  `  `    ``// Insert first two fibnonacci numbers ` `    ``int` `prev = ``0``, curr = ``1``; ` `  `  `    ``hash.add(prev); ` `    ``hash.add(curr); ` `  `  `    ``while` `(curr <= maxElement) { ` `  `  `        ``// Summation of last two numbers ` `        ``int` `temp = curr + prev; ` `  `  `        ``hash.add(temp); ` `  `  `        ``// Update the variable each time ` `        ``prev = curr; ` `        ``curr = temp; ` `    ``} ` `} ` `  `  `// Function to find the ` `// longest fibonacci subarray ` `static` `int` `longestFibSubarray( ` `    ``int` `arr[], ``int` `n) ` `{ ` `  `  `    ``// Find maximum value in the array ` `    ``int` `max_val = Arrays.stream(arr).max().getAsInt(); ` `  `  `    ``// Creating a set ` `    ``// containing Fibonacci numbers ` `    ``HashSet hash = ``new` `HashSet(); ` `  `  `    ``createHash(hash, max_val); ` `  `  `    ``int` `[]left = ``new` `int``[n]; ` `    ``int` `[]right = ``new` `int``[n]; ` `    ``int` `fibcount = ``0``, res = -``1``; ` `  `  `    ``// Left array is used to count number of ` `    ``// continuous fibonacci numbers starting ` `    ``// from left of current element ` `    ``for` `(``int` `i = ``0``; i < n; i++) { ` `  `  `        ``left[i] = fibcount; ` `  `  `        ``// Check if current element ` `        ``// is a fibonacci number ` `        ``if` `(hash.contains(arr[i])) { ` `            ``fibcount++; ` `        ``} ` `  `  `        ``else` `            ``fibcount = ``0``; ` `    ``} ` `  `  `    ``// Right array is used to count number of ` `    ``// continuous fibonacci numbers starting ` `    ``// from right of current element ` `    ``fibcount = ``0``; ` `  `  `    ``for` `(``int` `i = n - ``1``; i >= ``0``; i--) { ` `  `  `        ``right[i] = fibcount; ` `  `  `        ``// Check if current element ` `        ``// is a fibonacci number ` `        ``if` `(hash.contains(arr[i])) { ` `            ``fibcount++; ` `        ``} ` `        ``else` `            ``fibcount = ``0``; ` `    ``} ` `  `  `    ``for` `(``int` `i = ``0``; i < n; i++) ` `        ``res = Math.max( ` `            ``res, ` `            ``left[i] + right[i]); ` `  `  `    ``return` `res; ` `} ` `  `  `// Driver code ` `public` `static` `void` `main(String[] args) ` `{ ` `  `  `    ``int` `arr[] = { ``2``, ``8``, ``5``, ``7``, ``3``, ``5``, ``7` `}; ` `    ``int` `n = arr.length; ` `  `  `    ``System.out.print(longestFibSubarray(arr, n) ` `         ``+``"\n"``); ` `  `  `} ` `} ` ` `  `// This code is contributed by PrinciRaj1992 `

 `# Python3 program to find length of the longest  ` `# subarray with all fibonacci numbers  ` ` `  `N ``=` `100000`  ` `  `# Function to create hash table  ` `# to check for Fibonacci numbers  ` `def` `createHash(``hash``, maxElement) : ` ` `  `    ``# Insert first two fibnonacci numbers  ` `    ``prev ``=` `0` `    ``curr ``=` `1`  ` `  `    ``hash``.add(prev)  ` `    ``hash``.add(curr)  ` ` `  `    ``while` `(curr <``=` `maxElement) : ` ` `  `        ``# Summation of last two numbers  ` `        ``temp ``=` `curr ``+` `prev  ` ` `  `        ``hash``.add(temp)  ` ` `  `        ``# Update the variable each time  ` `        ``prev ``=` `curr  ` `        ``curr ``=` `temp  ` ` `  `# Function to find the  ` `# longest fibonacci subarray   ` `def` `longestFibSubarray(arr, n) : ` ` `  `    ``# Find maximum value in the array  ` `    ``max_val ``=` `max``(arr) ` ` `  `    ``# Creating a set  ` `    ``# containing Fibonacci numbers  ` `    ``hash` `=` `{``int``} ` ` `  `    ``createHash(``hash``, max_val)  ` ` `  `    ``left ``=` `[ ``0` `for` `i ``in` `range``(n)] ` ` `  `    ``right ``=` `[ ``0` `for` `i ``in` `range``(n)] ` ` `  `    ``fibcount ``=` `0` `    ``res ``=` `-``1`  ` `  `    ``# Left array is used to count number of  ` `    ``# continuous fibonacci numbers starting  ` `    ``# from left of current element  ` `    ``for` `i ``in` `range``(n) : ` ` `  `        ``left[i] ``=` `fibcount  ` ` `  `        ``# Check if current element  ` `        ``# is a fibonacci number  ` `        ``if` `(arr[i] ``in` `hash``) : ` `            ``fibcount ``+``=` `1` `        ``else``: ` `            ``fibcount ``=` `0`  ` `  `    ``# Right array is used to count number of  ` `    ``# continuous fibonacci numbers starting  ` `    ``# from right of current element  ` `    ``fibcount ``=` `0`  ` `  `    ``for` `i ``in` `range``(n``-``1``,``-``1``,``-``1``) : ` ` `  `        ``right[i] ``=` `fibcount  ` ` `  `        ``# Check if current element  ` `        ``# is a fibonacci number  ` `        ``if` `(arr[i] ``in` `hash``) : ` `            ``fibcount ``+``=` `1` `        ``else``: ` `            ``fibcount ``=` `0`  ` `  `    ``for` `i ``in` `range``(``0``,n) :  ` `        ``res ``=` `max``(res, left[i] ``+` `right[i])  ` ` `  `    ``return` `res ` ` `  `# Driver code  ` `arr ``=` `[ ``2``, ``8``, ``5``, ``7``, ``3``, ``5``, ``7` `]  ` `n ``=` `len``(arr) ` `print``(longestFibSubarray(arr, n)) ` ` `  `# This code is contributed by Sanjit_Prasad `

 `// C# program to find length of the longest ` `// subarray with all fibonacci numbers ` `using` `System; ` `using` `System.Linq; ` `using` `System.Collections.Generic; ` ` `  `class` `GFG{ ` `static` `readonly` `int` `N = 100000; ` `   `  `// Function to create hash table ` `// to check for Fibonacci numbers ` `static` `void` `createHash(HashSet<``int``> hash, ` `                ``int` `maxElement) ` `{ ` `   `  `    ``// Insert first two fibnonacci numbers ` `    ``int` `prev = 0, curr = 1; ` `   `  `    ``hash.Add(prev); ` `    ``hash.Add(curr); ` `   `  `    ``while` `(curr <= maxElement) { ` `   `  `        ``// Summation of last two numbers ` `        ``int` `temp = curr + prev; ` `   `  `        ``hash.Add(temp); ` `   `  `        ``// Update the variable each time ` `        ``prev = curr; ` `        ``curr = temp; ` `    ``} ` `} ` `   `  `// Function to find the ` `// longest fibonacci subarray ` `static` `int` `longestFibSubarray( ` `    ``int` `[]arr, ``int` `n) ` `{ ` `   `  `    ``// Find maximum value in the array ` `    ``int` `max_val = arr.Max(); ` `   `  `    ``// Creating a set ` `    ``// containing Fibonacci numbers ` `    ``HashSet<``int``> hash = ``new` `HashSet<``int``>(); ` `   `  `    ``createHash(hash, max_val); ` `   `  `    ``int` `[]left = ``new` `int``[n]; ` `    ``int` `[]right = ``new` `int``[n]; ` `    ``int` `fibcount = 0, res = -1; ` `   `  `    ``// Left array is used to count number of ` `    ``// continuous fibonacci numbers starting ` `    ``// from left of current element ` `    ``for` `(``int` `i = 0; i < n; i++) { ` `   `  `        ``left[i] = fibcount; ` `   `  `        ``// Check if current element ` `        ``// is a fibonacci number ` `        ``if` `(hash.Contains(arr[i])) { ` `            ``fibcount++; ` `        ``} ` `   `  `        ``else` `            ``fibcount = 0; ` `    ``} ` `   `  `    ``// Right array is used to count number of ` `    ``// continuous fibonacci numbers starting ` `    ``// from right of current element ` `    ``fibcount = 0; ` `   `  `    ``for` `(``int` `i = n - 1; i >= 0; i--) { ` `   `  `        ``right[i] = fibcount; ` `   `  `        ``// Check if current element ` `        ``// is a fibonacci number ` `        ``if` `(hash.Contains(arr[i])) { ` `            ``fibcount++; ` `        ``} ` `        ``else` `            ``fibcount = 0; ` `    ``} ` `   `  `    ``for` `(``int` `i = 0; i < n; i++) ` `        ``res = Math.Max( ` `            ``res, ` `            ``left[i] + right[i]); ` `   `  `    ``return` `res; ` `} ` `   `  `// Driver code ` `public` `static` `void` `Main(String[] args) ` `{ ` `   `  `    ``int` `[]arr = { 2, 8, 5, 7, 3, 5, 7 }; ` `    ``int` `n = arr.Length; ` `   `  `    ``Console.Write(longestFibSubarray(arr, n) ` `         ``+``"\n"``);   ` `} ` `} ` ` `  `// This code is contributed by sapnasingh4991 `

Output:
```5
```

GeeksforGeeks has prepared a complete interview preparation course with premium videos, theory, practice problems, TA support and many more features. Please refer Placement 100 for details

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.

Article Tags :