📌  相关文章
📜  Java程序打印形成 AP 的有序数组中的所有三元组

📅  最后修改于: 2022-05-13 01:55:38.729000             🧑  作者: Mango

Java程序打印形成 AP 的有序数组中的所有三元组

给定一个不同正整数的排序数组,打印所有形成 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 )
更好的解决方案是使用散列。我们从左到右遍历数组。我们将每个元素视为中间元素,将其之后的所有元素视为下一个元素。为了搜索前一个元素,我们使用哈希表。

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)


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.


输出 :

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 三元组问题中讨论的相同概念。这个想法是从第二个元素开始,将每个元素固定为中间元素,并在三元组中搜索其他两个元素(一个小一个大)。
下面是上述思想的实现。

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.

输出 :

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)
有关详细信息,请参阅完整的文章在形成 AP 的排序数组中打印所有三元组!