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

JavaScriptで配列から3つの数値の最大積を求める方法

JavaScriptで、数値の配列を引数として受け取る関数を作成することを考えます。この関数は、配列内の任意の3つの要素の組み合わせの中で最も大きな積となる3つの要素を選び出し、その積を返すものとします。

入力配列が次の場合を考えてみましょう。

const arr = [-10, 7, 29, 30, 5, -10, -70];

このとき、期待される出力は次のとおりです。

const output = 21000;

これは、選ばれる3つの数値が「30」「-10」「-70」であり、30 × (-10) × (-70) = 21000 となるためです。

アプローチのポイント:負の数への対応

ここで重要なのは、配列には負の要素が含まれる可能性があるという点です。負の数同士を掛け合わせると正の数になるため、最大積は次の2パターンのうち大きい方となります。

最小値1 × 最小値2 × 最大値1
最大値1 × 最大値2 × 最大値3

つまり、配列を昇順にソートした後、「最も大きい3つの数の積」と「最も小さい2つの負の数 × 最大の数の積」を比較し、大きい方を返せばよいのです。

実装コード

以下が実際のコードです。

const arr = [-10, 7, 29, 30, 5, -10, -70];

const threeProduct = (arr = []) => {
    const sorter = (a, b) => a - b;
    arr.sort(sorter);
    let pro1 = 1, pro2 = 1;
    let len = arr.length - 1;
    // 最大の3つの数の積を計算
    for (let i = len; i > len - 3; i--) {
        pro1 = pro1 * arr[i];
    }
    // 最小の2つの数 × 最大の数 の積を計算
    pro2 = arr[0] * arr[1] * arr[len];
    return Math.max(pro1, pro2);
}

console.log(threeProduct(arr));

出力結果

コンソールには次のように表示されます。

21000

コードの解説

  • arr.sort(sorter):比較関数 (a, b) => a - b を渡して配列を数値の昇順に並べ替えています。デフォルトのソートは文字列比較になるため、数値配列では必ず比較関数を指定しましょう。
  • pro1:ソート後の配列の末尾(最大値側)から3つ連続した要素の積を計算します。
  • pro2:先頭の2つの最小値と、最大値1つの積を計算します。負の数が2つ以上存在する場合、この組み合わせが最大になることがあります。
  • Math.max(pro1, pro2):2つの候補を比較し、より大きい方を返します。

計算量について

この実装はソートを使用するため、時間計算量は O(n log n) となります。もし配列が非常に大きい場合は、ループを1回だけ回して「最大の3つ」と「最小の2つ」を追跡する方式にすれば、O(n) まで計算量を抑えることも可能です。

  1. C++でn以下の素数の積を求める方法【エラトステネスの篩】

    はじめに数値 n が与えられたとき、1 から n までの範囲に含まれる素数の積を求めることを考えてみましょう。例えば n = 7 の場合、2 × 3 × 5 × 7 = 210 となるため、出力は 210 になります。アルゴリズムの考え方この問題を解くには、まずエラトステネスの篩(ふるい)を使って 1 から n までのすべての素数を効率よく列挙し、その後、見つかった素数を順番に掛け合わせて積を計算します。エラトステネスの篩は、各素数の倍数を順次除外していくことで素数を判定する古典的な手法です。計算量が O(n log log n) と非常に効率的なため、ある程度大きな n に対しても高速に動作

  2. 3つの数値から最大値を見つけるPythonプログラム

    このチュートリアルでは、3つの数値の中から最大値を求めるPythonプログラムを作成します。3つの数値が与えられたとき、その中で最も大きい数値を見つけることが目標です。まず、理解を深めるためにサンプルのテストケースをいくつか見てみましょう。入力: a, b, c = 2, 34, 4 出力: 34入力: a, b, c = 25, 3, 12 出力: 25入力: a, b, c = 5, 5, 5 出力: 5それでは、3つの数値の中から最大値を求める手順を見ていきましょう。アルゴリズム1. 3つの数値 a、b、c を初期化する。 2. a が b と c の両方より大きければ、a を出力する。