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

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] が返されます。

コードの仕組み

このアルゴリズムのポイントは次のとおりです。

  • 初期値: 変数 firstsecond を 0 で初期化し、これまで見つかった最良のペアを保持します。
  • 全探索: 二重ループにより、配列内の異なるインデックス(i != j)のすべての組み合わせについて合計値 tmp を計算します。
  • 判定条件: 合計が目標値以下(tmp <= sum)かつ、これまでの最大値より大きい場合に、そのペアを新しい候補として更新します。
  • 戻り値: ループ完了後、最良のペアを配列形式で返します。

注意点と改善のヒント

この実装は理解しやすい反面、時間計算量が O(n²) となるため、大きな配列ではパフォーマンスが低下する可能性があります。配列がソート済みであれば、両端ポインタ(Two Pointer)法を使うことで O(n log n)(ソート込み)まで効率化できます。また、現在の実装では目標値を超える合計は除外されるため、「目標値以下で最大の合計」を探す仕様になっている点にも注意してください。

  1. JavaScriptで指定した間隔(ギャップ)を持つ2つの素数のペアを見つける方法

    問題 数値 gap を第一引数として、また2つの数値からなる範囲配列を第二引数として受け取るJavaScript関数を作成する必要があります。この関数は、指定された範囲内に存在し、かつ絶対差が gap と一致する素数のペアを見つけて返すものです。 例えば、gap = 4、範囲が [20, 200] の場合、「37」と「41」はどちらも素数であり、その差はちょうど4であるため、条件を満たすペアとなります。 解決のアプローチ この問題は以下のステップで解決できます。 素数判定: 与えられた数が素数かどうかを判定するヘルパー関数を用意します。 素数の収集: 指定された範囲内のすべての素数を配列に

  2. JavaScriptで合計と最大公約数(GCD)から元の2つの数値を求める方法

    問題2つの引数を受け取るJavaScript関数を作成する必要があります。1つ目の引数はある2つの数値の合計(sum)を、2つ目の引数はその2つの数値の最大公約数(GCD:HCF)を表します。関数の目的は、これらの条件を満たす元の2つの数値を見つけ出し、配列として返すことです。考え方(アプローチ)2つの数値の最大公約数が gcd であるとき、その2つの数値はどちらも必ず gcd の倍数になります。したがって、合計も必ず gcd の倍数でなければなりません。この性質を使うと、処理は次のようにシンプルにまとめられます。sum % gcd !== 0 の場合(合計がGCDで割り切れない場合)、条件を