📌  相关文章
📜  通过仅去除一个元素形成的最长斐波那契子阵列的长度

📅  最后修改于: 2021-04-22 02:11:25             🧑  作者: Mango

给定一个包含整数的数组A ,任务是找到通过从数组中仅删除一个元素形成的最长斐波纳契子数组的长度。

例子:

方法:可以通过在每个索引之前和每个索引之后计算连续的斐波那契数来解决上述问题。

  1. 现在再次遍历数组,并找到一个索引,该索引前后的斐波纳契数最大。
  2. 为了检查斐波那契数,我们将构建一个哈希表,其中包含所有小于或等于数组中最大值的斐波那契数,以测试O(1)时间中的数字。

下面是上述方法的实现:

CPP
// 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& 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 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[0]);
  
    cout << longestFibSubarray(arr, n)
         << endl;
  
    return 0;
}


Java
// 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
# 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#
// 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 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 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;
    
    Console.Write(longestFibSubarray(arr, n)
         +"\n");  
}
}
  
// This code is contributed by sapnasingh4991


输出:
5