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

JavaScriptでソートせずに配列の最大値と最小値の差を求める方法

ランダムな順序で並んだ数値の配列が与えられたとき、その配列を一切並べ替えることなく、含まれる最大値と最小値の差を返す関数を作成するのが今回の課題です。

配列をソートして最初と最後の要素を見る方法もありますが、ソートには O(n log n) の計算量が必要です。そこで本記事では、Array.prototype.reduce() を使って配列を一度だけ走査し、最大値と最小値を同時に追跡する効率的なアプローチを紹介します。この方法なら計算量は O(n) で済み、元の配列も変更されません。

実装例

まず、初期値として max: -Infinitymin: Infinity を持つオブジェクトをアキュムレータに設定します。そして各要素を走査しながら、現在の最大値・最小値より大きい・小さい場合はそれぞれ値を更新していきます。最終的に max - min を返すことで差が求まります。

const arr = [23, 65, 67, 23, 2, 6, 87, 23, 45, 65, 3, 234, 3];

const findDifference = arr => {
    // 空の配列の場合は 0 を返す
    if(!arr.length){
        return 0;
    }

    const creds = arr.reduce((acc, val) => {
        let { max, min } = acc;
        if(val > max){
            max = val;
        };
        if(val < min){
            min = val;
        };
        return { max, min };
    }, {
        max: -Infinity,
        min: Infinity
    });

    return creds.max - creds.min;
};

console.log(findDifference(arr));

出力結果

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

232

この配列の場合、最大値は 234、最小値は 2 なので、その差である 232 が出力されます。

補足:別の書き方との比較

スプレッド構文を使えば、Math.max(...arr) - Math.min(...arr) のように1行で書くことも可能です。ただし、この方法は要素数が非常に多い配列では引数の上限によりエラーになる可能性があります。一方、reduce() を使う本手法は配列のサイズに関係なく安全に動作するため、実務での利用におすすめです。

  1. C言語プログラムで数列の最大値と最小値を求める方法

    問題 コンソールからユーザーが入力した4つの整数の中から、最も大きい数(最大値)と最も小さい数(最小値)を見つけます。 解決方法 最大値と最小値を求めるには、if文による条件分岐を使用します。まず1つ目の入力値を仮の最大値・最小値として設定し、残りの数値と順番に比較していきます。比較の基本ロジックは以下の通りです。 if(minno>q) // 1番目と2番目の数を比較    minno=q; else if(maxno<q)    maxno=q; if(minno>r) // 1番目と3番目の数を比較    

  2. 【Java】配列内の最大素数と最小素数の差を求める方法|エラトステネスの篩で効率的に解く

    問題の概要100万未満の整数要素で構成される配列が与えられたとき、配列内に存在する最大の素数と最小の素数の差を求めます。実行例たとえば、次のような配列を考えてみましょう。配列: [1, 2, 3, 4, 5]最大の素数 = 5最小の素数 = 2差 = 5 - 2 = 3解決アプローチ:エラトステネスの篩この問題を効率的に解くには、エラトステネスの篩(Sieve of Eratosthenes)という古典的なアルゴリズムを使用します。これは、ある数値以下のすべての素数を高速に列挙できる手法として知られています。具体的な手順は以下の通りです。あらかじめ100万以下のすべての素数をエラトステネスの篩