C++で配列内の「x < y」となるペア(x, y)の個数を数える方法
問題の概要
整数型の配列が与えられます。この配列の値を組み合わせて作成できるペア(x, y)のうち、x の値が y より小さいという条件を満たすペアの総数を求めるのが本記事の課題です。
入力: int arr[] = { 2, 4, 3, 1 }
出力: x < y となる配列内のペア(x, y)の個数 ― 6
説明
入力配列 { 2, 4, 3, 1 } から作れるすべての順序付きペアを検証すると、結果は次のようになります。
| X | Y | X < Y |
| 2 | 4 | 成立 |
| 2 | 3 | 成立 |
| 2 | 1 | 不成立 |
| 4 | 3 | 不成立 |
| 4 | 1 | 不成立 |
| 4 | 2 | 不成立 |
| 3 | 2 | 不成立 |
| 1 | 2 | 成立 |
| 3 | 4 | 成立 |
| 1 | 4 | 成立 |
| 3 | 1 | 不成立 |
| 1 | 3 | 不成立 |
この表から、条件を満たすペアは全部で 6 個であることが確認できます。
プログラムで使用するアプローチ
- ペアを作る元となる整数要素の配列を受け取ります。
- 配列のサイズを計算し、後続の処理のためにデータを関数へ渡します。
- x < y を満たすペアの数を格納するための一時変数 count を用意します。
- i を 0 から配列サイズまで動かす外側の FOR ループを開始します。
- そのループの中で、j を 0 から配列サイズまで動かす内側の FOR ループを開始します。
- 内側のループの中で、arr[i] < arr[j] が真であれば count を 1 増やします。
- すべての組み合わせを調べ終えたら count を返します。
- 結果を出力します。
サンプルコード(C++)
#include <iostream>
using namespace std;
int X_Less_Y(int arr[], int size){
int count = 0;
for (int i = 0; i < size; i++){
for (int j = 0; j < size; j++){
if (arr[i] < arr[j]){
count++;
}
}
}
return count;
}
int main(){
int arr[] = { 2, 4, 3, 1 };
int size = sizeof(arr) / sizeof(arr[0]);
cout<<"x < y となる配列内のペア(x, y)の個数: "<<X_Less_Y(arr, size);
return 0;
}
実行結果
上記のコードを実行すると、次の出力が得られます。
x < y となる配列内のペア(x, y)の個数: 6
計算量と効率化のヒント
この実装では二重ループですべてのペアを調べるため、時間計算量は O(n²) となります。配列の要素数が増えると処理時間が急激に伸びる点には注意が必要です。
より効率化したい場合は、配列をあらかじめソートしておき、二分探索(std::lower_bound など)を使って「自分より大きい要素の個数」を求める方法が有効です。この場合、計算量を O(n log n) まで抑えることができます。
-
C++でa+b+c=dを満たす最大のdを配列から見つける方法
整数の集合が与えられたとき、d = a + b + c を満たす数 d を見つけ、その値を最大化することが目標です。ここで重要なのは、a、b、c、d のすべてが集合内に存在していなければならないという点です。集合の要素数は最小1個、最大1000個であり、各要素は有限の数であるものとします。例えば、集合が {2, 3, 5, 7, 12} の場合、12 = 2 + 3 + 7 と表現できるため、最大の d は 12 となります。解法のアプローチ:ハッシュテーブルを活用するこの問題は、ハッシュテーブル(ハッシュマップ)の手法を使うことで効率的に解くことができます。基本的な考え方は以下の通りです。ま
-
C++で配列内の a % b = k を満たすすべてのペア(a, b)を検索する方法
問題の概要配列 A が与えられたとき、その中から a % b = k を満たすすべてのペア(a, b)を見つけることを考えます。たとえば、配列 A = [2, 3, 4, 5, 7]、k = 3 の場合、条件を満たすペアは (7, 4)、(3, 4)、(3, 5)、(3, 7) となります。ここで注意したいのは、(a, b) が順序付きペアであるという点です。つまり (3, 4) と (4, 3) は別々の候補として扱われ、それぞれ剰余演算の結果が k と一致するかどうかが個別に判定されます。解法のアプローチこの問題は、ブルートフォース(総当たり)法によって解くことができます。手順は以下のとお