JavaScriptで配列内の3番目に大きい数値を求める方法
問題の概要
数値が格納された配列を受け取り、その中から3番目に大きい数値を取り出して返すJavaScript関数を作成します。
ただし、関数の時間計算量はO(n)以内に収める必要があります。つまり、sort()などで配列を並べ替えることなく、たった1回のループ処理で目的の数値を見つけなければなりません。
解決アプローチ
最も効率的なのは、上位3つの値を保持する変数を用意し、配列を1周しながら順次更新していく手法です。具体的な手順は以下の通りです。
first(最大値)、second(2番目)、third(3番目)をすべて-Infinityで初期化します。- 各要素がすでに保持している3つの値のいずれかと重複している場合はスキップします(重複値を除外するため)。
- 要素が
firstより大きければ、3つの変数を1つずつ後ろへずらして更新します。 - 要素が
secondより大きければ、secondとthirdを更新します。 - 要素が
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
-
JavaScriptで配列内の3番目に大きい数値を取得する方法
JavaScriptでは、数値の配列を第1引数(唯一の引数)として受け取る関数を作成することが求められます。この関数の役割は、配列の中から3番目に大きい数値を選び出して返すことです。もし配列内に3番目に大きい数値が存在しない場合(ユニークな数値が3つ未満の場合)は、代わりに配列の最大値を返します。具体例たとえば、入力配列が以下のようになっているとします。const arr = [34, 67, 31, 87, 12, 30, 22];この場合、数値を降順に並べると「87 → 67 → 34」となるため、期待される出力は次のとおりです。const output = 34;実装コードこの処理を実現
-
【JavaScript入門】配列内で最初の非連続な数値を見つける方法
はじめに本記事では、JavaScriptを使って「数値の配列の中から、直前の要素と連続していない最初の数値」を見つける方法を解説します。アルゴリズムの練習やコーディング面接の対策としても役立つ基本的な問題です。 問題の定義数値の配列を受け取るJavaScript関数を作成する必要があります。この関数は、直前の要素に対して +1 となっていない(連続していない)最初の要素を返さなければなりません。 言い換えると、隣り合う要素同士の差が1以外になる箇所が現れたとき、その箇所の後ろ側の要素を返すという処理です。なお、そのような要素が必ず配列内に1つ以上存在するものとします。 サンプルコード以下は、実