JavaScriptで目標値に最も近い合計になる数のペアを見つける方法
この記事では、JavaScriptを使って「配列の中から2つの数を選び、その合計が指定した目標値に最も近くなるペア」を見つける関数の実装方法を解説します。
問題の概要
求められているのは、次のような仕様を持つJavaScript関数です。
- 第1引数として数値の配列を受け取る
- 第2引数として目標となる数値を受け取る
- 元の配列から選んだ2つの数のうち、合計が第2引数の値に最も近くなる組み合わせを配列として返す
実装コード
以下が実際のコード例です。二重ループですべてのペアを調べ、条件に合う最適なペアを記録していくシンプルな全探索アプローチを採用しています。
const arr = [1, 2, 3, 4, 5, 6, 7];
const num = 14;
const closestPair = (arr, sum) => {
let first = 0, second = 0;
for(let i in arr) {
for(let j in arr) {
if(i != j) {
let tmp = arr[i] + arr[j];
if(tmp <= sum && tmp > first + second) {
first = arr[i];
second = arr[j];
}
};
};
};
return [first, second];
};
console.log(closestPair(arr, num));
実行結果
コンソールには次のように出力されます。
[6, 7]
この例では、配列内の2つの数の合計が14(目標値)以下である組み合わせの中で、最も14に近いのは 6 + 7 = 13 であるため、結果として [6, 7] が返されます。
コードの仕組み
このアルゴリズムのポイントは次のとおりです。
- 初期値: 変数
firstとsecondを 0 で初期化し、これまで見つかった最良のペアを保持します。 - 全探索: 二重ループにより、配列内の異なるインデックス(
i != j)のすべての組み合わせについて合計値tmpを計算します。 - 判定条件: 合計が目標値以下(
tmp <= sum)かつ、これまでの最大値より大きい場合に、そのペアを新しい候補として更新します。 - 戻り値: ループ完了後、最良のペアを配列形式で返します。
注意点と改善のヒント
この実装は理解しやすい反面、時間計算量が O(n²) となるため、大きな配列ではパフォーマンスが低下する可能性があります。配列がソート済みであれば、両端ポインタ(Two Pointer)法を使うことで O(n log n)(ソート込み)まで効率化できます。また、現在の実装では目標値を超える合計は除外されるため、「目標値以下で最大の合計」を探す仕様になっている点にも注意してください。
-
JavaScriptで指定した間隔(ギャップ)を持つ2つの素数のペアを見つける方法
問題 数値 gap を第一引数として、また2つの数値からなる範囲配列を第二引数として受け取るJavaScript関数を作成する必要があります。この関数は、指定された範囲内に存在し、かつ絶対差が gap と一致する素数のペアを見つけて返すものです。 例えば、gap = 4、範囲が [20, 200] の場合、「37」と「41」はどちらも素数であり、その差はちょうど4であるため、条件を満たすペアとなります。 解決のアプローチ この問題は以下のステップで解決できます。 素数判定: 与えられた数が素数かどうかを判定するヘルパー関数を用意します。 素数の収集: 指定された範囲内のすべての素数を配列に
-
JavaScriptで合計と最大公約数(GCD)から元の2つの数値を求める方法
問題2つの引数を受け取るJavaScript関数を作成する必要があります。1つ目の引数はある2つの数値の合計(sum)を、2つ目の引数はその2つの数値の最大公約数(GCD:HCF)を表します。関数の目的は、これらの条件を満たす元の2つの数値を見つけ出し、配列として返すことです。考え方(アプローチ)2つの数値の最大公約数が gcd であるとき、その2つの数値はどちらも必ず gcd の倍数になります。したがって、合計も必ず gcd の倍数でなければなりません。この性質を使うと、処理は次のようにシンプルにまとめられます。sum % gcd !== 0 の場合(合計がGCDで割り切れない場合)、条件を