Maximice la diferencia común de un AP que tiene la array dada como una subsecuencia

Dada una array ordenada arr[] que consta de N elementos distintos, la tarea es encontrar la máxima diferencia común posible de una progresión aritmética tal que la array dada sea una subsecuencia de esa progresión aritmética .

Ejemplos:

Entrada: arr[] = { 2, 4, 6, 8 } 
Salida:
Explicación: 
Dado que arr[] es una subsecuencia de la progresión aritmética { 2, 4, 6, 8, 10, …}, la diferencia común de las la progresión aritmética es 2.

Entrada: arr[] = { 2, 5, 11, 23 } 
Salida:
Explicación: 
Dado que arr[] es una subsecuencia de la progresión aritmética { 2, 5, 8, 11, 14, …, 23, …}, la La diferencia común de la progresión aritmética es 2.

Enfoque ingenuo: el enfoque más simple para resolver este problema es iterar sobre el rango [(arr[N – 1] – arr[0]), 1] usando la variable CD (diferencia común) y para cada valor en el rango, verifique si la array dada puede ser un subsiguiente de una progresión aritmética con el primer elemento como arr[0] y la diferencia común como CD . Esto es posible simplemente verificando si la diferencia entre cada par de elementos de array adyacentes es divisible por CD o no. Si se encuentra que es cierto, imprima el valor de CD como la respuesta máxima posible. 

Complejidad de tiempo: O(N * (Maxm – Minm)), donde Maxm y Minm son el último y el primer elemento de la array respectivamente. 
Espacio Auxiliar: O(1) 

Enfoque eficiente: el enfoque anterior se puede optimizar en función de las siguientes observaciones:

Si arr[i] es el término X y arr [0] es el primer término de una progresión aritmética con diferencia común CD, entonces: 
 

arr[i] = arr[0] + (X – 1) * CD 
=> (arr[i] – arr[0]) = (X – 1) * CD

Por lo tanto, la máxima diferencia común posible del AP es la GCD de la diferencia absoluta de cada par de elementos de array adyacentes. 
 

Siga los pasos a continuación para resolver el problema:

A continuación se muestra la implementación del enfoque anterior.

C++

// C++ program to implement
// the above approach
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to find the maximum common
// difference of an AP such that arr[]
// is a subsequence of that AP
int MaxComDiffSubAP(int arr[], int N)
{
    // Stores maximum common difference
    // of an AP with given conditions
    int maxCD = 0;
 
    // Traverse the array
    for (int i = 0; i < N - 1; i++) {
 
        // Update maxCD
        maxCD = __gcd(maxCD,
                      arr[i + 1] - arr[i]);
    }
 
    return maxCD;
}
 
// Driver Code
int main()
{
    int arr[] = { 1, 3, 7, 9 };
    int N = sizeof(arr) / sizeof(arr[0]);
 
    cout << MaxComDiffSubAP(arr, N);
 
    return 0;
}

Java

// Java program to implement
// the above approach 
class GFG
{
 
  // Recursive function to return gcd of a and b
  static int gcd(int a, int b)
  {
 
    // Everything divides 0
    if (a == 0)
      return b;
    if (b == 0)
      return a;
 
    // base case
    if (a == b)
      return a;
 
    // a is greater
    if (a > b)
      return gcd(a - b, b);
 
    return gcd(a, b - a);
  }
 
  // Function to find the maximum common
  // difference of an AP such that arr[]
  // is a subsequence of that AP
  static int MaxComDiffSubAP(int arr[], int N)
  {
     
    // Stores maximum common difference
    // of an AP with given conditions
    int maxCD = 0;
 
    // Traverse the array
    for (int i = 0; i < N - 1; i++)
    {
 
      // Update maxCD
      maxCD = gcd(maxCD,
                  arr[i + 1] - arr[i]);
    }
 
    return maxCD;
  }
 
  // Driver Code
  public static void main (String[] args)
  {
    int arr[] = { 1, 3, 7, 9 };
    int N = arr.length;
 
    System.out.print(MaxComDiffSubAP(arr, N));
  }
}
 
// This code is contributed by AnkThon

Python3

# Python3 program to implement
# the above approach
from math import gcd
 
# Function to find the maximum common
# difference of an AP such that arr[]
# is a subsequence of that AP
def MaxComDiffSubAP(arr, N):
     
    # Stores maximum common difference
    # of an AP with given conditions
    maxCD = 0
 
    # Traverse the array
    for i in range(N - 1):
         
        # Update maxCD
        maxCD = gcd(maxCD, arr[i + 1] - arr[i])
 
    return maxCD
 
# Driver Code
if __name__ == '__main__':
 
    arr = [ 1, 3, 7, 9 ]
    N = len(arr)
     
    print(MaxComDiffSubAP(arr, N))
 
# This code is contributed by mohit kumar 29

C#

// C# program to implement
// the above approach 
using System;
 
class GFG{
  
// Recursive function to return
// gcd of a and b
static int gcd(int a, int b)
{
 
    // Everything divides 0
    if (a == 0)
        return b;
    if (b == 0)
        return a;
     
    // base case
    if (a == b)
        return a;
     
    // a is greater
    if (a > b)
        return gcd(a - b, b);
     
    return gcd(a, b - a);
}
 
// Function to find the maximum common
// difference of an AP such that arr[]
// is a subsequence of that AP
static int MaxComDiffSubAP(int[] arr, int N)
{
 
    // Stores maximum common difference
    // of an AP with given conditions
    int maxCD = 0;
     
    // Traverse the array
    for(int i = 0; i < N - 1; i++)
    {
         
        // Update maxCD
        maxCD = gcd(maxCD,
                    arr[i + 1] - arr[i]);
    }
    return maxCD;
}
 
// Driver Code
public static void Main ()
{
    int[] arr = { 1, 3, 7, 9 };
    int N = arr.Length;
     
    Console.WriteLine(MaxComDiffSubAP(arr, N));
}
}
 
// This code is contributed by susmitakundugoaldanga

Javascript

<script>
 
// Javascript program for the above approach
 
// Recursive function to return gcd of a and b
function gcd(a, b)
{
     
    // Everything divides 0
    if (a == 0)
        return b;
    if (b == 0)
        return a;
     
    // base case
    if (a == b)
        return a;
     
    // a is greater
    if (a > b)
        return gcd(a - b, b);
     
    return gcd(a, b - a);
}
     
// Function to find the maximum common
// difference of an AP such that arr[]
// is a subsequence of that AP
function MaxComDiffSubAP(arr, N)
{
 
    // Stores maximum common difference
    // of an AP with given conditions
    let maxCD = 0;
     
    // Traverse the array
    for(let i = 0; i < N - 1; i++)
    {
         
        // Update maxCD
        maxCD = gcd(maxCD,
                    arr[i + 1] - arr[i]);
    }
    return maxCD;
}
 
// Driver Code
let arr = [ 1, 3, 7, 9 ];
let N = arr.length;
 
document.write(MaxComDiffSubAP(arr, N));
 
// This code is contributed by splevel62
 
</script>
Producción: 

2

 

Complejidad temporal: O(N)  
Espacio auxiliar: O(1)

Publicación traducida automáticamente

Artículo escrito por nk14646 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *