📌  相关文章
📜  将所有三胞胎打印成形成AP的有序阵列

📅  最后修改于: 2021-04-24 17:56:39             🧑  作者: Mango

给定不同正整数的排序数组,请打印形成AP(或算术级数)的所有三元组

例子 :

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

一个简单的解决方案是运行三个嵌套循环以生成所有三元组,对于每个三元组,检查其是否形成AP。该解决方案的时间复杂度为O(n 3 )

更好的解决方案是使用哈希。我们从左到右遍历数组。我们将每个元素视为中间元素,并将其后的所有元素视为下一个元素。要搜索上一个元素,我们使用哈希表。

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 
using namespace std;
   
// Function to print all triplets in
// given sorted array that forms AP
void printAllAPTriplets(int arr[], int n)
{
    unordered_set 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 s = 
                 new ArrayList();
        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 s = new List();
        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


C++
// C++ program to print all triplets in given 
// array that form Arithmetic Progression
#include 
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
= 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
?>


输出 :

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

时间复杂度: O(n 2 )
辅助空间: O(n)

一个有效的解决方案基于对数组进行排序的事实。我们使用与GP三元组问题中讨论的相同的概念。这个想法是从第二个元素开始,将每个元素固定为中间元素,然后在一个三元组中搜索另外两个元素(一个较小而一个较大)。

以下是上述想法的实现。

C++

// C++ program to print all triplets in given 
// array that form Arithmetic Progression
#include 
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

= 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
?>

输出 :

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

时间复杂度: O(n 2 )
辅助空间: O(1)