Progresión aritmética más larga que se puede formar con la diferencia común dada d

Dada una array desordenada a[] de tamaño n y un entero d que es la diferencia común, la tarea es encontrar la longitud del AP más largo que se puede formar para todos los j, mayor que algún i(<n), 

if a[j] = a[i] + (j-i) * d

es decir, a[j] está en el AP de a[i] del índice i al j.
Ejemplos: 
 

Entrada: n = 6, d = 2 
arr[] = {1, 2, 5, 7, 9, 85} 
Salida:
El AP más largo, teniendo en cuenta los índices, es [1, 5, 7, 9] 
desde 5 está 2 índices por delante de 1 y encajaría en el AP si se comenzara 
desde el índice 0. como 5 = 1 + (2 – 0) * 2. Entonces, la salida es 4.
Entrada: n = 10, d = 3 
arr[] = {1, 4, 2, 5, 20, 11, 56, 100, 20, 23} 
Salida:
El AP más largo, teniendo en cuenta los índices, es [2, 5, 11, 20, 23] 
ya que 11 son 2 índices por delante de 5 y 20 está 3 índices por delante de 11. Por lo tanto 
, encajarían en el AP si comenzaran desde el índice 2. 
 

Enfoque ingenuo: para cada elemento, calcule la longitud del AP más largo que podría formar e imprima el máximo entre ellos. Implica una complejidad temporal O(n 2 ) .
Un enfoque eficiente es usar Hashing.
Cree un mapa donde la clave es el elemento inicial de un AP y su valor es la cantidad de elementos en ese AP. La idea es actualizar el valor en la clave ‘a’ (que está en el índice i y cuyo elemento inicial aún no está en el mapa) por 1 siempre que el elemento en el índice j(>i) pueda estar en el AP de ‘a ‘(como elemento inicial). Luego imprimimos el valor máximo entre todos los valores en el mapa.
 

C++

// C++ code for finding the
// maximum length of AP
 
#include <bits/stdc++.h>
using namespace std;
int maxlenAP(int* a, int n, int d)
{
    // key=starting element of an AP,
    // value=length of AP
    unordered_map<int, int> m;
 
    // since the length of longest AP is at least
    // one i.e. the number itself.
    int maxt = 1;
 
    // if element a[i]'s starting element(i.e., a[i]-i*d)
    // is not in map then its value is 1 else there already
    // exists a starting element of an AP of which a[i]
    // can be a part.
    for (int i = 0; i < n; i++) {
        m[a[i] - i * d]++;
    }
 
    // auto operator stores the key,
    // value pair type from the map.
    for (auto& it : m)
        if (it.second > maxt)
 
            // calculating the length of longest AP.
            maxt = it.second;
 
    return maxt;
}
 
// Driver code
int main()
{
    int n = 10, d = 3;
    int a[10] = { 1, 4, 2, 5, 20, 11, 56, 100, 20, 23 };
 
    cout << maxlenAP(a, n, d) << endl;
 
    return 0;
}

Java

// Java code for finding the
// maximum length of AP
import java.io.*;
import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Map;
import java.lang.*;
 
class GFG
{
static int maxlenAP(int a[],
                    int n, int d)
{
    // key=starting element of an AP,
    // value=length of AP
    HashMap<Integer, Integer> m =
                    new HashMap<Integer, Integer>();
 
    // since the length of longest
    // AP is at least one i.e.
    // the number itself.
    int maxt = 1;
 
    // if element a[i]'s starting
    // element(i.e., a[i]-i*d)
    // is not in map then its value
    // is 1 else there already
    // exists a starting element of
    // an AP of which a[i] can be
    // a part.
    for (int i = 0; i < n; i++)
    {
        if(m.containsKey(a[i] - i * d))
        {
            int freq = m.get(a[i] - i * d);
            freq++;
            m.put(a[i] - i * d, freq);
        }
        else
        {
            m.put(a[i] - i * d, 1);
        }
    }
 
    // auto operator stores the key,
    // value pair type from the map.
    for(Entry<Integer, Integer> val: m.entrySet())
    {
        if (maxt < val.getValue())
            maxt = val.getValue();
    }
    return maxt;
}
 
// Driver code
public static void main(String[] args)
{
    int n = 10, d = 3;
    int a[] = new int[]{ 1, 4, 2, 5, 20, 11,
                         56, 100, 20, 23 };
 
    System.out.print(maxlenAP(a, n, d) + "\n");
}
}

C#

// C# code for finding the
// maximum length of AP
using System;
using System.Collections.Generic;
 
class GFG
{
    static int maxlenAP(int []a,
                    int n, int d)
    {
        // key=starting element of an AP,
        // value=length of AP
        Dictionary<int,int> m =
                    new Dictionary<int,int>();
 
        // since the length of longest
        // AP is at least one i.e.
        // the number itself.
        int maxt = 1;
 
        // if element a[i]'s starting
        // element(i.e., a[i]-i*d)
        // is not in map then its value
        // is 1 else there already
        // exists a starting element of
        // an AP of which a[i] can be
        // a part.
        for (int i = 0; i < n; i++)
        {
            if(m.ContainsKey(a[i] - i * d))
            {
                int freq = m[a[i] - i * d];
                freq++;
                m.Remove(a[i] - i * d);
                m.Add(a[i] - i * d, freq);
            }
            else
            {
                m.Add(a[i] - i * d, 1);
            }
        }
 
        // auto operator stores the key,
        // value pair type from the map.
        foreach(var val in m)
        {
            if (maxt < val.Value)
                maxt = val.Value;
        }
        return maxt;
}
 
// Driver code
public static void Main(String[] args)
{
    int n = 10, d = 3;
    int []a = new int[]{ 1, 4, 2, 5, 20, 11,
                        56, 100, 20, 23 };
 
    Console.Write(maxlenAP(a, n, d) + "\n");
}
}
 
// This code is contributed by 29AjayKumar

Python 3

# Python code for finding the
# maximum length of AP
 
def maxlenAP(a, n, d):
 
    # key = starting element of an AP,
    # value = length of AP
    m = dict()
 
    # since the length of longest AP is at least
    # one i.e. the number itself.
    maxt = 1
 
    # if element a[i]'s starting element(i.e., a[i]-i*d)
    # is not in map then its value is 1 else there already
    # exists a starting element of an AP of which a[i]
    # can be a part.
    for i in range(n):
        if (a[i] - i * d) in m:
            m[a[i] - i * d] += 1
        else:
            m[a[i] - i * d] = 1
 
    # In this it variable will be
    # storing key value of dictionary.
    for it in m:
        if m[it] > maxt:
 
            # calculating the length of longest AP.
            maxt = m[it]
 
    return maxt
 
 
# Driver code
if __name__ == "__main__":
    n, d = 10, 3
    a = [1, 4, 2, 5, 20, 11, 56, 100, 20, 23]
    print(maxlenAP(a, n, d))
 
# This code is contributed by
# sanjeev2552

Javascript

<script>
 
// JavaScript code for finding the
// maximum length of AP
 
function maxlenAP(a, n, d) {
    // key=starting element of an AP,
    // value=length of AP
    let m = new Map();
 
    // since the length of longest AP is at least
    // one i.e. the number itself.
    let maxt = 1;
 
    // if element a[i]'s starting element(i.e., a[i]-i*d)
    // is not in map then its value is 1 else there already
    // exists a starting element of an AP of which a[i]
    // can be a part.
    for (let i = 0; i < n; i++) {
        if (m.has(a[i] - i * d)) {
            m.set(a[i] - i * d, m.get(a[i] - i * d) + 1)
        } else {
            m.set(a[i] - i * d, 1)
        }
    }
 
    // auto operator stores the key,
    // value pair type from the map.
    for (let it of m)
        if (it[1] > maxt)
 
            // calculating the length of longest AP.
            maxt = it[1];
 
    return maxt;
}
 
// Driver code
 
let n = 10, d = 3;
let a = [1, 4, 2, 5, 20, 11, 56, 100, 20, 23];
 
document.write(maxlenAP(a, n, d) + "<br>");
 
</script>
Producción: 

5

 

Complejidad de tiempo: O(n)

Espacio Auxiliar: O(n)

Publicación traducida automáticamente

Artículo escrito por MadhuramJajoo 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 *