Imprima todos los tripletes en una array ordenada que forman AP

Dada una array ordenada de enteros positivos distintos, imprima todos los tripletes que forman
ejemplos AP (o progresión aritmética): 
 

Input : arr[] = { 2, 6, 9, 12, 17, 22, 31, 32, 35, 42 };
Output :
6 9 12
2 12 22
12 17 22
2 17 32
12 22 32
9 22 35
2 22 42
22 32 42

Input : arr[] = { 3, 5, 6, 7, 8, 10, 12};
Output :
3 5 7
5 6 7
6 7 8
6 8 10
8 10 12

Una solución simple es ejecutar tres bucles anidados para generar todos los tripletes y, para cada triplete, verificar si forma AP o no. La complejidad de tiempo de esta solución es O(n 3 )
Una mejor solución es usar hashing. Recorremos la array de izquierda a derecha. Consideramos cada elemento como medio y todos los elementos posteriores como elemento siguiente. Para buscar el elemento anterior, usamos una tabla hash.
 

C++

// C++ program to print all triplets in given
// array that form Arithmetic Progression
// C++ program to print all triplets in given
// array that form Arithmetic Progression
#include <bits/stdc++.h>
using namespace std;
  
// Function to print all triplets in
// given sorted array that forms AP
void printAllAPTriplets(int arr[], int n)
{
    unordered_set<int> s;
    for (int i = 0; i < n - 1; i++)
    {
    for (int j = i + 1; j < n; j++)
    {
        // Use hash to find if there is
        // a previous element with difference
        // equal to arr[j] - arr[i]
        int diff = arr[j] - arr[i];
        if (s.find(arr[i] - diff) != s.end())
            cout << arr[i] - diff << " " << arr[i]
                 << " " << arr[j] << endl;
    }
    s.insert(arr[i]);
    }
}
  
// Driver code
int main()
{
    int arr[] = { 2, 6, 9, 12, 17,
                 22, 31, 32, 35, 42 };
    int n = sizeof(arr) / sizeof(arr[0]);
    printAllAPTriplets(arr, n);
    return 0;
}

Java

// Java program to print all
// triplets in given array
// that form Arithmetic
// Progression
import java.io.*;
import java.util.*;
 
class GFG
{
    // Function to print
    // all triplets in
    // given sorted array
    // that forms AP
    static void printAllAPTriplets(int []arr,
                                   int n)
    {
        ArrayList<Integer> s =
                 new ArrayList<Integer>();
        for (int i = 0;
                 i < n - 1; i++)
        {
            for (int j = i + 1; j < n; j++)
            {
                // Use hash to find if
                // there is a previous
                // element with difference
                // equal to arr[j] - arr[i]
                int diff = arr[j] - arr[i];
                boolean exists =
                        s.contains(arr[i] - diff);
                 
                if (exists)
                    System.out.println(arr[i] - diff +
                                        " " + arr[i] +
                                        " " + arr[j]);
            }
             
        s.add(arr[i]);
        }
    }
     
    // Driver code
    public static void main(String args[])
    {
        int []arr = {2, 6, 9, 12, 17,
                     22, 31, 32, 35, 42};
        int n = arr.length;
        printAllAPTriplets(arr, n);
    }
}
 
// This code is contributed by
// Manish Shaw(manishshaw1)

Python3

# Python program to print all
# triplets in given array
# that form Arithmetic
# Progression
 
# Function to print
# all triplets in
# given sorted array
# that forms AP
def printAllAPTriplets(arr, n) :
 
    s = [];
    for i in range(0, n - 1) :
     
        for j in range(i + 1, n) :
         
            # Use hash to find if
            # there is a previous
            # element with difference
            # equal to arr[j] - arr[i]
            diff = arr[j] - arr[i];
 
            if ((arr[i] - diff) in arr) :
                print ("{} {} {}" .
                        format((arr[i] - diff),
                                arr[i], arr[j]),
                                    end = "\n");
         
    s.append(arr[i]);
     
# Driver code
arr = [2, 6, 9, 12, 17,
       22, 31, 32, 35, 42];
n = len(arr);
printAllAPTriplets(arr, n);
 
# This code is contributed by
# Manish Shaw(manishshaw1)

C#

// C# program to print all
// triplets in given array
// that form Arithmetic
// Progression
using System;
using System.Collections.Generic;
 
class GFG
{
    // Function to print
    // all triplets in
    // given sorted array
    // that forms AP
    static void printAllAPTriplets(int []arr,
                                   int n)
    {
        List<int> s = new List<int>();
        for (int i = 0;
                 i < n - 1; i++)
        {
            for (int j = i + 1; j < n; j++)
            {
                // Use hash to find if
                // there is a previous
                // element with difference
                // equal to arr[j] - arr[i]
                int diff = arr[j] - arr[i];
                bool exists = s.Exists(element =>
                                       element == (arr[i] -
                                                   diff));
                if (exists)
                    Console.WriteLine(arr[i] - diff +
                                      " " + arr[i] +
                                      " " + arr[j]);
            }
        s.Add(arr[i]);
        }
    }
     
    // Driver code
    static void Main()
    {
        int []arr = new int[]{ 2, 6, 9, 12, 17,
                                 22, 31, 32, 35, 42 };
        int n = arr.Length;
        printAllAPTriplets(arr, n);
    }
}
// This code is contributed by
// Manish Shaw(manishshaw1)

PHP

<?php
// PHP program to pr$all
// triplets in given array
// that form Arithmetic
// Progression
 
// Function to print
// all triplets in
// given sorted array
// that forms AP
function printAllAPTriplets($arr, $n)
{
    $s = array();
    for ($i = 0; $i < $n - 1; $i++)
    {
        for ($j = $i + 1;
             $j < $n; $j++)
        {
            // Use hash to find if
            // there is a previous
            // element with difference
            // equal to arr[j] - arr[i]
            $diff = $arr[$j] - $arr[$i];
 
            if (in_array($arr[$i] -
                         $diff, $arr))
                echo(($arr[$i] - $diff) .
                         " " . $arr[$i] .
                         " " . $arr[$j] . "\n");
        }
    array_push($s, $arr[$i]);
    }
}
 
// Driver code
$arr = array(2, 6, 9, 12, 17,
            22, 31, 32, 35, 42);
$n = count($arr);
printAllAPTriplets($arr, $n);
 
// This code is contributed by
// Manish Shaw(manishshaw1)
?>

Javascript

<script>
 
// JavaScript program to print all triplets in given
// array that form Arithmetic Progression
  
// Function to print all triplets in
// given sorted array that forms AP
function printAllAPTriplets( arr, n){
    const s = new Set()
    for (let i = 0; i < n - 1; i++)
    {
    for (let j = i + 1; j < n; j++)
    {
        // Use hash to find if there is
        // a previous element with difference
        // equal to arr[j] - arr[i]
        let diff = arr[j] - arr[i];
        if (s.has(arr[i] - diff))
            document.write(arr[i] - diff +" " + arr[i]
                 + " " + arr[j] + "<br>");
    }
    s.add(arr[i]);
    }
}
  
// Driver code
 
let arr = [ 2, 6, 9, 12, 17,
                 22, 31, 32, 35, 42 ];
let n = arr.length;
printAllAPTriplets(arr, n);
 
</script>

Producción :  

6 9 12
2 12 22
12 17 22
2 17 32
12 22 32
9 22 35
2 22 42
22 32 42

Complejidad temporal: O(n 2
Espacio auxiliar: O(n)
Una solución eficiente se basa en el hecho de que la array está ordenada. Usamos el mismo concepto que se discutió en la pregunta del triplete GP . La idea es comenzar desde el segundo elemento y fijar cada elemento como un elemento medio y buscar los otros dos elementos en un triplete (uno más pequeño y otro más grande). 
A continuación se muestra la implementación de la idea anterior. 
 

C++

// C++ program to print all triplets in given
// array that form Arithmetic Progression
#include <bits/stdc++.h>
using namespace std;
  
// Function to print all triplets in
// given sorted array that forms AP
void printAllAPTriplets(int arr[], int n)
{
    for (int i = 1; i < n - 1; i++)
    {
  
        // Search other two elements of
        // AP with arr[i] as middle.
        for (int j = i - 1, k = i + 1; j >= 0 && k < n;)
        {
  
            // if a triplet is found
            if (arr[j] + arr[k] == 2 * arr[i])
            {
                cout << arr[j] << " " << arr[i]
                     << " " << arr[k] << endl;
  
                // Since elements are distinct,
                // arr[k] and arr[j] cannot form
                // any more triplets with arr[i]
                k++;
                j--;
            }
  
            // If middle element is more move to
            // higher side, else move lower side.
            else if (arr[j] + arr[k] < 2 * arr[i])
                k++;        
            else
                j--;        
        }
    }
}
  
// Driver code
int main()
{
    int arr[] = { 2, 6, 9, 12, 17,
                  22, 31, 32, 35, 42 };
    int n = sizeof(arr) / sizeof(arr[0]);
    printAllAPTriplets(arr, n);
    return 0;
}

Java

// Java implementation to print
// all the triplets in given array
// that form Arithmetic Progression
  
import java.io.*;
  
class GFG
{
      
    // Function to print all triplets in
    // given sorted array that forms AP
    static void findAllTriplets(int arr[], int n)
    {
          
        for (int i = 1; i < n - 1; i++)
        {
      
            // Search other two elements
            // of AP with arr[i] as middle.
            for (int j = i - 1, k = i + 1; j >= 0 && k < n;)
            {
                  
                // if a triplet is found
                if (arr[j] + arr[k] == 2 * arr[i])
                {
                    System.out.println(arr[j] +" " +
                                       arr[i]+ " " + arr[k]);
      
                    // Since elements are distinct,
                    // arr[k] and arr[j] cannot form
                    // any more triplets with arr[i]
                    k++;
                    j--;
                }
      
                // If middle element is more move to
                // higher side, else move lower side.
                else if (arr[j] + arr[k] < 2 * arr[i])
                    k++;        
                else
                    j--;        
            }
        }
    }
  
    // Driver code
    public static void main (String[] args)
    {
          
        int arr[] = { 2, 6, 9, 12, 17,
                      22, 31, 32, 35, 42 };
        int n = arr.length;
          
        findAllTriplets(arr, n);
    }
}
  
// This code is contributed by vt_m.

Python 3

# python 3 program to print all triplets in given
# array that form Arithmetic Progression
  
# Function to print all triplets in
# given sorted array that forms AP
def printAllAPTriplets(arr, n):
  
    for i in range(1, n - 1):
  
        # Search other two elements of
        # AP with arr[i] as middle.
        j = i - 1
        k = i + 1
        while(j >= 0 and k < n ):
  
            # if a triplet is found
            if (arr[j] + arr[k] == 2 * arr[i]):
                print(arr[j], "", arr[i], "", arr[k])
  
                # Since elements are distinct,
                # arr[k] and arr[j] cannot form
                # any more triplets with arr[i]
                k += 1
                j -= 1
              
  
            # If middle element is more move to
            # higher side, else move lower side.
            elif (arr[j] + arr[k] < 2 * arr[i]):
                k += 1    
            else:
                j -= 1    
          
# Driver code
arr = [ 2, 6, 9, 12, 17,
        22, 31, 32, 35, 42 ]
n = len(arr)
printAllAPTriplets(arr, n)
  
# This article is contributed
# by Smitha Dinesh Semwal

C#

// C# implementation to print
// all the triplets in given array
// that form Arithmetic Progression
  
using System;
  
class GFG
{
      
    // Function to print all triplets in
    // given sorted array that forms AP
    static void findAllTriplets(int []arr, int n)
    {
          
        for (int i = 1; i < n - 1; i++)
        {
      
            // Search other two elements
            // of AP with arr[i] as middle.
            for (int j = i - 1, k = i + 1; j >= 0 && k < n;)
            {
                  
                // if a triplet is found
                if (arr[j] + arr[k] == 2 * arr[i])
                {
                    Console.WriteLine(arr[j] +" " +
                                      arr[i]+ " " + arr[k]);
      
                    // Since elements are distinct,
                    // arr[k] and arr[j] cannot form
                    // any more triplets with arr[i]
                    k++;
                    j--;
                }
      
                // If middle element is more move to
                // higher side, else move lower side.
                else if (arr[j] + arr[k] < 2 * arr[i])
                    k++;        
                else
                    j--;        
            }
        }
    }
  
    // Driver code
    public static void Main ()
    {
          
        int []arr = { 2, 6, 9, 12, 17,
                      22, 31, 32, 35, 42 };
        int n = arr.Length;
          
        findAllTriplets(arr, n);
    }
}
  
// This code is contributed by vt_m.

PHP

<?php
// PHP implementation to print
// all the triplets in given array
// that form Arithmetic Progression
 
// Function to print all triplets in
// given sorted array that forms AP
function findAllTriplets($arr, $n)
{
    for ($i = 1; $i < $n - 1; $i++)
    {
 
        // Search other two elements
        // of AP with arr[i] as middle.
        for ($j = $i - 1, $k = $i + 1;
                   $j >= 0 && $k < $n😉
        {
             
            // if a triplet is found
            if ($arr[$j] + $arr[$k] == 2 *
                           $arr[$i])
            {
                echo $arr[$j] ." " .
                     $arr[$i]. " " .
                     $arr[$k] . "\n";
 
                // Since elements are distinct,
                // arr[k] and arr[j] cannot form
                // any more triplets with arr[i]
                $k++;
                $j--;
            }
 
            // If middle element is more move to
            // higher side, else move lower side.
            else if ($arr[$j] + $arr[$k] < 2 *
                                     $arr[$i])
                $k++;        
            else
                $j--;        
        }
    }
}
 
// Driver code
$arr = array(2, 6, 9, 12, 17,
             22, 31, 32, 35, 42);
              
$n = count($arr);
findAllTriplets($arr, $n);
 
// This code is contributed by Sam007
?>

Javascript

<script>
 
// JavaScript program to print all triplets in given
// array that form Arithmetic Progression
 
// Function to print all triplets in
// given sorted array that forms AP
function printAllAPTriplets(arr, n)
{
    for (let i = 1; i < n - 1; i++)
    {
 
        // Search other two elements of
        // AP with arr[i] as middle.
        for (let j = i - 1, k = i + 1; j >= 0 && k < n;)
        {
 
            // if a triplet is found
            if (arr[j] + arr[k] == 2 * arr[i])
            {
                document.write(arr[j] + " " + arr[i]
                    + " " + arr[k] + "<br>");
 
                // Since elements are distinct,
                // arr[k] and arr[j] cannot form
                // any more triplets with arr[i]
                k++;
                j--;
            }
 
            // If middle element is more move to
            // higher side, else move lower side.
            else if (arr[j] + arr[k] < 2 * arr[i])
                k++;       
            else
                j--;       
        }
    }
}
 
// Driver code
    let arr = [ 2, 6, 9, 12, 17,
                22, 31, 32, 35, 42 ];
    let n = arr.length;
    printAllAPTriplets(arr, n);
 
 
// This code is contributed by Surbhi Tyagi.
 
</script>

Producción :  

6 9 12
2 12 22
12 17 22
2 17 32
12 22 32
9 22 35
2 22 42
22 32 42

Complejidad de Tiempo : O(n 2
Espacio Auxiliar : O(1)
 

Publicación traducida automáticamente

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