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

JavaScriptで最大三重積配列を求める方法|コード例付きでわかりやすく解説

問題の概要

整数の配列を唯一の引数として受け取るJavaScript関数を実装する必要があります。

入力配列をもとに、以下の条件に従って同じ長さの新しい配列を構築します。

  • 出力配列の各要素は、その位置までに出現した「最大の3つの数値」の積となる
  • インデックスが3未満の場合(まだ3つの要素が出現していない場合)は -1 を返す
  • 積の計算には同じ値を再利用できるが、それぞれ異なるインデックスに存在する要素である必要がある

入力例と出力例

たとえば、入力配列が以下の場合を考えてみましょう。

const arr = [1, 2, 3, 4, 5, 6];

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

const output = [-1, -1, 6, 24, 60, 120];

この結果は以下のように解釈できます。

  • インデックス 0・1 → まだ3つの要素がそろっていないため -1
  • インデックス 2 → 1 × 2 × 3 = 6
  • インデックス 3 → 2 × 3 × 4 = 24
  • インデックス 4 → 3 × 4 × 5 = 60
  • インデックス 5 → 4 × 5 × 6 = 120

実装コード

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

const arr = [1, 2, 3, 4, 5, 6];
const maximumTripleProduct = (arr = []) => {
    const res = [];
    const max = [arr[0], arr[1], arr[2]];
    res[0] = res[1] = -1;
    res[2] = arr[0] * arr[1] * arr[2];
    for(let i = 3; i < arr.length; i++){
        max.push(arr[i]);
        max.sort((a, b) => b - a);
        max.pop();
        res[i] = max[0] * max[1] * max[2];
    };
    return res;
};
console.log(maximumTripleProduct(arr));

コードの解説

このアルゴリズムのポイントは、常に「上位3つの最大値」だけを保持する配列 max を維持することです。

  1. 初期状態として、配列の最初の3要素を max に格納し、結果配列の先頭2要素には -1 を設定します。
  2. インデックス2以降のループ処理では、新しい要素を pushmax に追加します。
  3. 降順にソートした後、最小の要素(4番目に入った値)を pop で削除することで、常に最大3要素のみを保持します。
  4. 残った3要素の積を計算し、結果配列の対応する位置に格納します。

ソート対象の配列サイズは常に4以下であるため、要素数が増えてもパフォーマンスが大きく劣化せず、全体の計算量はほぼ O(n) の効率で動作します。

出力結果

上記コードをコンソールで実行すると、以下の出力が得られます。

[-1, -1, 6, 24, 60, 120]

まとめ

本記事では、配列を走査しながら「それまでに出現した最大3つの数値の積」を効率的に求める方法を解説しました。上位k個の最大値を維持しながら配列を処理するこのテクニックは、ストリーミングデータの処理やスライディングウィンドウ的な問題にも応用できる、覚えておくと便利なアルゴリズムパターンです。

  1. JavaScriptで数字列の中から最大の5桁の連続数字を見つける方法

    問題少なくとも5桁以上の数字で構成される文字列を受け取るJavaScript関数を作成する必要があります。この関数は、与えられた数字列の中に含まれる「連続する5桁」の中で最も大きな数値を返さなければなりません。たとえば、入力が 123546544 の場合、取りうる5桁の組み合わせは「12354」「23546」「35465」「54654」「46544」となり、この中で最大のものは 54654 です。解決アプローチ考え方はシンプルです。文字列を先頭から1文字ずつずらしながら、5文字分を切り出す切り出したすべての5桁の部分文字列を配列に格納するMath.max() を使って最大値を求めるJavaSc

  2. JavaScriptで配列内の唯一の異なる文字列を見つける方法

    問題 文字列の配列を受け取るJavaScript関数を作成する必要があります。配列内のすべての文字列は同じ文字(またはその並べ替え)で構成されていますが、ただ1つの文字列だけが異なる文字セットを含んでいます。この関数の目的は、その唯一の文字列を見つけ出して返すことです。 例: 次のような配列が与えられたとします。 [ba, abc, acb, bac, foo, bca, cab, cba] この場合、求めるべき文字列は「foo」です。 文字列には空白が含まれることがありますが、空白自体は意味を持たず、空白以外の記号のみが判定の対象となります。たとえば、空白だけで構成された文字列は空文字列と