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

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

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

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;
}


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;
}


输出 :

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;
}

输出 :

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 的排序数组中打印所有三元组!