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

JavaScriptでソートされていない配列から最大値と最小値を線形時間で求める方法

はじめに

JavaScriptでは、ソートされていない数値の配列から最大値と最小値を効率的に取り出したいケースがよくあります。本記事では、線形時間(O(n))かつ定数領域(O(1))で動作する関数を実装し、最小値(min)と最大値(max)を含むオブジェクトとして返す方法を解説します。

実装の考え方

アプローチは非常にシンプルです。まず配列の先頭要素を最大値・最小値の初期値として設定し、その後、配列全体を一度だけ走査します。走査中に現在の最大値より大きい要素が見つかれば最大値を更新し、現在の最小値より小さい要素が見つかれば最小値を更新していきます。これにより、配列をソートすることなく1回のループで両方の値を取得できます。

コード例

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

const arr = [112, 24, 31, 44, 101, 203, 33, 56];
const findMaxMin = (arr) => {
    let max = arr[0];
    let min = arr[0];
    for(let i = 0; i < arr.length; i++) {
        if(arr[i] > max) {
            max = arr[i];
        }
        else if (arr[i] < min) {
            min = arr[i];
        }
    };
    return {
        min, max
    };
};
console.log(findMaxMin(arr));

出力結果

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

{ min: 24, max: 203 }

パフォーマンスについて

このアルゴリズムは配列を1回だけ走査するため、時間計算量はO(n)であり、追加のメモリも不要なので空間計算量はO(1)です。大規模な配列でも高速に動作します。また、if / else if の構造を採用しているため、各要素との比較回数も抑えられ、無駄のない処理になっています。

  1. JavaScriptでスペース区切りの数値文字列から最大値と最小値を抽出する方法

    問題 今回実装するのは、スペースで区切られた複数の数値を含む文字列を引数として受け取るJavaScript関数です。関数は、文字列の中から最大の数値と最小の数値だけを抜き出し、それらをスペースで区切った1つの文字列として返す必要があります。 入力例: const str = 5 57 23 23 7 2 78 6; 出力例: const output = 78 2; これは、配列内の最大値が 78、最小値が 2 であるためです。 解決策:reduce() を使った実装 以下のコードでは、split() で文字列を配列に変換し、reduce() メソッドを使って1回の走査で最大値と最小値を同時

  2. 【JavaScript入門】配列内で最初の非連続な数値を見つける方法

    はじめに本記事では、JavaScriptを使って「数値の配列の中から、直前の要素と連続していない最初の数値」を見つける方法を解説します。アルゴリズムの練習やコーディング面接の対策としても役立つ基本的な問題です。 問題の定義数値の配列を受け取るJavaScript関数を作成する必要があります。この関数は、直前の要素に対して +1 となっていない(連続していない)最初の要素を返さなければなりません。 言い換えると、隣り合う要素同士の差が1以外になる箇所が現れたとき、その箇所の後ろ側の要素を返すという処理です。なお、そのような要素が必ず配列内に1つ以上存在するものとします。 サンプルコード以下は、実