📌  相关文章
📜  仅删除一个元素形成的最长斐波那契子数组的长度

📅  最后修改于: 2021-09-06 11:29:04             🧑  作者: 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


Javascript


输出:
5

如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live