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

JavaScriptで配列内の3番目に大きい数値を求める方法

問題の概要

数値が格納された配列を受け取り、その中から3番目に大きい数値を取り出して返すJavaScript関数を作成します。

ただし、関数の時間計算量はO(n)以内に収める必要があります。つまり、sort()などで配列を並べ替えることなく、たった1回のループ処理で目的の数値を見つけなければなりません。

解決アプローチ

最も効率的なのは、上位3つの値を保持する変数を用意し、配列を1周しながら順次更新していく手法です。具体的な手順は以下の通りです。

  • first(最大値)、second(2番目)、third(3番目)をすべて -Infinity で初期化します。
  • 各要素がすでに保持している3つの値のいずれかと重複している場合はスキップします(重複値を除外するため)。
  • 要素が first より大きければ、3つの変数を1つずつ後ろへずらして更新します。
  • 要素が second より大きければ、secondthird を更新します。
  • 要素が third より大きければ、third だけを更新します。

ループ終了後、third が初期値のまま(有効な3番目の値が存在しない場合)であれば、代わりに first を返します。これにより、計算量O(n)・単一パスという要件を満たせます。

コード例

const arr = [1, 5, 23, 3, 676, 4, 35, 4, 2];
const findThirdMax = (arr) => {
  let [first, second, third] = [-Infinity, -Infinity, -Infinity];
  for (let el of arr) {
    if (el === first || el === second || el === third) {
      continue;
    }
    if (el > first) {
      [first, second, third] = [el, first, second];
      continue;
    }
    if (el > second) {
      [second, third] = [el, second];
      continue;
    }
    if (el > third) {
      third = el;
      continue;
    }
  }
  return third !== -Infinity ? third : first;
};
console.log(findThirdMax(arr));

出力結果

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

23
  1. JavaScriptで配列内の3番目に大きい数値を取得する方法

    JavaScriptでは、数値の配列を第1引数(唯一の引数)として受け取る関数を作成することが求められます。この関数の役割は、配列の中から3番目に大きい数値を選び出して返すことです。もし配列内に3番目に大きい数値が存在しない場合(ユニークな数値が3つ未満の場合)は、代わりに配列の最大値を返します。具体例たとえば、入力配列が以下のようになっているとします。const arr = [34, 67, 31, 87, 12, 30, 22];この場合、数値を降順に並べると「87 → 67 → 34」となるため、期待される出力は次のとおりです。const output = 34;実装コードこの処理を実現

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

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