C++で配列内の合計がゼロになるすべてのトリプレットを見つける方法
はじめに
このチュートリアルでは、配列の中から合計がゼロになる3つの要素(トリプレット)をすべて見つけるC++プログラムを作成します。
まずは、問題を解決するための手順を確認しましょう。
ダミーデータを含む配列を作成します。
3つの要素を選ぶために、三重のネストしたループを記述し、配列の末尾まで反復処理を行います。
選んだ3つの要素を加算します。
その合計が0と等しいかどうかを比較します。
等しい場合は、該当する3つの要素を出力します。
コード例
それでは、実際のコードを見てみましょう。
#include<bits/stdc++.h>
using namespace std;
void findTripletsWithSumZero(int arr[], int n){
bool is_found = false;
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] == 0) {
cout << arr[i] << " " << arr[j] << " " << arr[k] << endl;
is_found = true;
}
}
}
}
if (is_found == false) {
cout << "Triplets doesn't exist"<<endl;
}
}
int main() {
int arr[] = {0, 1, -1, 2, 2, -4, 3, 4};
findTripletsWithSumZero(arr, 8);
return 0;
}
出力結果
上記のプログラムを実行すると、次のような結果が得られます。
0 1 -1
0 -4 4
1 -4 3
2 2 -4
計算量について
このアプローチは3つのネストしたループを使用するため、時間計算量はO(n³)となります。配列のサイズが大きくなると処理に時間がかかる点に注意してください。より効率化したい場合は、配列をあらかじめソートしておき、2ポインタ法を組み合わせることで、時間計算量をO(n²)まで抑えることが可能です。
まとめ
本チュートリアルでは、三重ループを用いて配列内の合計がゼロになるトリプレットをすべて検出する方法を学びました。内容について質問がある場合は、ぜひコメント欄でお知らせください。
-
C++を使って行列内で合計が最大の列を見つける方法
ここでは、サイズ M × N の行列が与えられたときに、要素の合計が最大となる列を見つける方法を解説します。この問題では、難しいアルゴリズムを用いる必要はありません。行列を列方向に走査して各列の合計値を計算し、その合計が最大であれば、合計値と該当する列のインデックスを出力するというシンプルなアプローチで十分です。アルゴリズムの手順処理の流れは以下の通りです。1. 最大合計値を格納する変数 maxSum を INT_MIN で初期化し、列のインデックスを格納する index を -1 に設定します。2. 各列(0 ~ N-1)について、colSum 関数を使ってその列の要素の合計を計算します。3
-
Pythonでリスト内の指定した合計になるトリプレット(3つの要素の組み合わせ)をすべて見つける方法
数値のリストの中から、3つの要素を組み合わせたときに特定の合計値になる組み合わせを探したいケースはよくあります。このような3つ組のことを「トリプレット(triplet)」と呼びます。1つのリストには、条件を満たすトリプレットが複数存在する場合があります。例えば、合計10は「1, 6, 3」でも「1, 5, 4」でも実現できます。 この記事では、Pythonを使って、与えられた数値のリストから条件を満たすすべてのトリプレットを見つける2つの方法を解説します。 方法1:rangeと一時変数を使う伝統的なアプローチ まずは、ハッシュセット(set)と一時変数を活用する古典的な手法です。外側のループで