Minimum array elements to be changed to make it a Lucas Sequence

Given an array with N distinct elements. The task is to find the minimum number of elements to be changed in the array such that, the array contains first N Lucas Sequence terms.

Note: Lucas terms may be present in any order in the array.

Examples:

Input : arr[] = {29, 1, 3, 4, 5, 11, 18, 2}
Output : 1
5 must be changed to 7, to get first N(8) terms of Lucas Sequence.
Hence, 1 change is required

Input : arr[] = {4, 2, 3, 1}
Output : 0
All elements are already first N(4) terms in Lucas sequence.



Approach:

  • Insert first N(size of input array) Lucas Sequence terms in a set.
  • Traverse array from left to right and check if array element is present in the set.
  • If it is present that remove it from the set.
  • Minimum changes required is the size of the final remaining set.

Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to find the minimum number
// of elements to be changed in the array
// to make it a Lucas Sequence
#include <bits/stdc++.h>
using namespace std;
  
// Function that finds minimum changes to
// be made in the array
int lucasArray(int arr[], int n)
{
    set<int> s;
  
    // a and b are first two
    // lucas numbers
    int a = 2, b = 1;
    int c;
  
    // insert first n lucas elements to set
    s.insert(a);
    if (n >= 2)
        s.insert(b);
  
    for (int i = 0; i < n - 2; i++) {
        s.insert(a + b);
        c = a + b;
        a = b;
        b = c;
    }
  
    set<int>::iterator it;
    for (int i = 0; i < n; i++) {
        // if lucas element is present in array,
        // remove it from set
        it = s.find(arr[i]);
        if (it != s.end())
            s.erase(it);
    }
  
    // return the remaining number of
    // elements in the set
    return s.size();
}
  
// Driver code
int main()
{
    int arr[] = { 7, 11, 22, 4, 2, 1, 8, 9 };
    int n = sizeof(arr) / sizeof(arr[0]);
  
    cout << lucasArray(arr, n);
  
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to find the minimum number
// of elements to be changed in the array
// to make it a Lucas Sequence
import java.util.HashSet;
import java.util.Set;
  
class GfG
{
  
    // Function that finds minimum changes
    // to be made in the array
    static int lucasArray(int arr[], int n)
    {
        HashSet<Integer> s = new HashSet<>();
      
        // a and b are first two lucas numbers
        int a = 2, b = 1, c;
      
        // insert first n lucas elements to set
        s.add(a);
        if (n >= 2)
            s.add(b);
      
        for (int i = 0; i < n - 2; i++) 
        {
            s.add(a + b);
            c = a + b;
            a = b;
            b = c;
        }
      
        for (int i = 0; i < n; i++)
        {
            // if lucas element is present in array,
            // remove it from set
            if (s.contains(arr[i]))
                s.remove(arr[i]);
        }
      
        // return the remaining number of
        // elemnets in the set
        return s.size();
    }
  
    // Driver code
    public static void main(String []args)
    {
          
        int arr[] = { 7, 11, 22, 4, 2, 1, 8, 9 };
        int n = arr.length;
      
        System.out.println(lucasArray(arr, n));
    }
}
      
// This code is contributed by Rituraj Jain

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python 3 program to find the minimum number
# of elements to be changed in the array
# to make it a Lucas Sequence
  
# Function that finds minimum changes to
# be made in the array
def lucasArray(arr, n):
    s = set()
  
    # a and b are first two
    # lucas numbers
    a = 2
    b = 1
  
    # insert first n lucas elements to set
    s.add(a)
    if (n >= 2):
        s.add(b)
  
    for i in range(n - 2):
        s.add(a + b)
        c = a + b
        a = b
        b = c
  
    for i in range(n):
          
        # if lucas element is present in array,
        # remove it from set
        if (arr[i] in s):
            s.remove(arr[i])
  
    # return the remaining number of
    # elemnets in the set
    return len(s)
  
# Driver code
if __name__ == '__main__':
    arr = [7, 11, 22, 4, 2, 1, 8, 9]
    n = len(arr)
  
    print(lucasArray(arr, n))
      
# This code is contributed by
# Surendra_Gangwar

chevron_right


Output:

3


My Personal Notes arrow_drop_up

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.