C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++で指定された合計ですべてのトリプレットを印刷します


この問題では、一意の整数の配列と合計が与えられます。そして、同じ合計を形成できるトリプレットを見つける必要があります。

問題を解決するために例を見てみましょう-

Input : array = {0 , 2 , -1 , 1, -2}
Sum = 1
Output : 1 2 -2
0 2 -1

この問題を解決するために、合計を提供するすべてのトリプレットを見つけます。簡単なアプローチは、3つのループを使用して要素の合計を見つけ、適切なトリプレットを返すことです。

#include <iostream>
using namespace std;
void Triplets(int arr[], int n, int sum){
   for (int i = 0; i < n - 2; i++) {
      for (int j = i + 1; j < n - 1; j++) {
         for (int k = j + 1; k < n; k++) {
            if (arr[i] + arr[j] + arr[k] == sum) {
               cout<<arr[i]<<"\t"<<arr[j]<<"\t"<<arr[k]<<endl;
            }
         }
      }
   }
}
// Driver code
int main(){
   int arr[] = { 0 , 2 , -1 , 1, -2 };
   int n = sizeof(arr) / sizeof(arr[0]);
   cout<<"The Triplets are : \n";
   Triplets(arr, n, 1);
   return 0;
}

出力

トリプレットは-

0 2 -1
2 1 -2

ただし、このアプローチは時間計算量がo(n 3 になるため、効率的ではありません。 )3つのループを実行するため。そのため、他の手法を使用して、この問題を効果的に解決します。

1つの方法は、ハッシュを使用することです。この方法では、のすべての要素のペアを見つけて、それらが互いに補完し合うようにします。つまり、値xの要素の場合、要素-xが必要です。

これにより、コードの時間計算量が削減されます。

#include <bits/stdc++.h>
using namespace std;
void Triplets(int arr[], int n, int sum{
   for (int i = 0; i < n - 1; i++) {
      unordered_set<int> triplet;
      for (int j = i + 1; j < n; j++) {
         int third = sum - (arr[i] + arr[j]);
         if (triplet.find(third) != triplet.end())
            cout<<third<<"\t"<<arr[i]<<"\t"<<arr[j]<<endl;
         else
            triplet.insert(arr[j]);
      }
   }
}
int main(){
   int arr[] = { 0 , 2 , -1 , 1, -2 };
   int n = sizeof(arr) / sizeof(arr[0]);
   cout<<"The Triplets are : \n";
   Triplets(arr, n, 1);
   return 0;
}

出力

トリプレットは-

0 2 -1
2 1 -2

この方法は、配列を並べ替えることでより効果的になり、コードのスペースの複雑さが軽減されます。


  1. 特定のソースから宛先までのすべてのパスをC++で出力します

    この問題では、有向グラフが与えられ、グラフのソースから宛先までのすべてのパスを印刷する必要があります。 有向グラフ は、頂点aからbに向けられたエッジを持つグラフです。 問題を理解するために例を見てみましょう ソース=K宛先=P 出力: K -> T -> Y -> A -> P K -> T -> Y -> P K -> A -> P ここで、KからPへのパスを見つけました。パスをトラバースし、KからPに向かうすべてのパスを出力しました。 この問題を解決するために、深さ優先探索を使用してグラフをトラバースします。

  2. C++で指定された値になるすべての一意のトリプレット

    ここで、1つの興味深い問題が発生します。いくつかの要素を持つ配列があります。 1つの合計値が与えられます。私たちのタスクは、配列からトリプレットを見つけることであり、その合計は指定された合計と同じです。配列が{4、8、63、21、24、3、6、1、0}であり、合計値がS =18であると仮定します。したがって、トリプレットは{4、6、8}になります。複数のトリプレットが存在する場合は、それらすべてが表示されます。 アルゴリズム getTriplets(arr、n、sum)- トリプレットを格納するための1つの配列の定義を開始します。たとえば、trip_arrは、一意のトリプレットを格納するため