C++で合計が最大となるペアの個数を求めるアルゴリズム
問題の概要
配列が与えられたとき、「合計が最大となるペア」がいくつ存在するかを求める問題です。まずは具体例で確認しましょう。
入力
arr = [3, 4, 5, 2, 1, 2, 3, 4, 1, 5]
出力
1
この配列でペアの合計が最大になるのは 5 + 5 = 10 です。合計が 10 になるペアは (5, 5) の 1 組のみのため、答えは 1 となります。
アルゴリズム
考え方はシンプルで、以下の手順に従います。
- 配列を用意します。
- 最大合計(maxSum)を INT_MIN で初期化します。
- 二重ループですべてのペアを調べ、ペアの合計の最大値を求めます。
- ペアの個数を数えるためのカウンタを 0 で初期化します。
- もう一度二重ループで配列を走査し、ペアの合計が最大合計と一致したらカウンタをインクリメントします。
- カウンタの値(ペアの個数)を返します。
C++での実装
以下は、上記のアルゴリズムをC++で実装したコードです。
#include <bits/stdc++.h>
using namespace std;
// 合計が最大となるペアの個数を返す関数
int getMaxSumPairsCount(int a[], int n) {
int maxSum = INT_MIN;
// ステップ1: すべてのペアの中から最大の合計を求める
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
maxSum = max(maxSum, a[i] + a[j]);
}
}
int count = 0;
// ステップ2: 最大の合計になるペアの個数を数える
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
if (a[i] + a[j] == maxSum) {
count++;
}
}
}
return count;
}
int main() {
int arr[] = { 3, 4, 5, 2, 1, 2, 3, 4, 1, 5 };
int n = 10;
cout << getMaxSumPairsCount(arr, n) << endl;
return 0;
}
実行結果
上記のコードをコンパイルして実行すると、次の出力が得られます。
1
計算量について
この実装では二重ループですべてのペアを調べるため、時間計算量は O(n²)、空間計算量は O(1) になります。
より効率化したい場合は、配列を降順にソートして最大値と2番目に大きい値の組み合わせを確認する方法(O(n log n))や、1回の走査で上位2つの値を追跡しながらペアを数える方法(O(n))も検討できます。
-
【C++】指定された合計値となるすべてのペアを出力する方法
問題概要 この問題では、整数の配列と目標となる合計値が与えられ、その合計値と等しくなるすべての整数ペアを見つけて出力する必要があります。 具体例を使って問題を理解してみましょう。 入力: array = {1, 6, -2, 3}、sum = 4 出力: (1, 3) 、(6, -2) つまり、指定された合計値を持つペアをすべて見つけ出すことが求められています。 解法1:ブルートフォース(全探索) 最もシンプルな解決策は、合計値を生成する要素のペアを一つずつ確認していく方法です。配列を走査し、各要素について合計値に一致する組み合わせとなる数を探すことで実装できます。 この方法は理解しやすい反面
-
C++を使って行列内で合計が最大の列を見つける方法
ここでは、サイズ M × N の行列が与えられたときに、要素の合計が最大となる列を見つける方法を解説します。この問題では、難しいアルゴリズムを用いる必要はありません。行列を列方向に走査して各列の合計値を計算し、その合計が最大であれば、合計値と該当する列のインデックスを出力するというシンプルなアプローチで十分です。アルゴリズムの手順処理の流れは以下の通りです。1. 最大合計値を格納する変数 maxSum を INT_MIN で初期化し、列のインデックスを格納する index を -1 に設定します。2. 各列(0 ~ N-1)について、colSum 関数を使ってその列の要素の合計を計算します。3