JavaScriptで配列の要素をユニークにする最小操作回数を求める方法
本記事では、数値の配列を受け取り、すべての要素をユニーク(重複なし)にするために必要な最小の操作回数を求める JavaScript のアルゴリズムを解説します。
問題概要
数値の配列 arr を最初の引数として受け取る JavaScript 関数を作成します。
ここで「1回の操作」とは、配列内の任意の要素 arr[i] を選んで 1 増やす(インクリメントする)ことを指します。関数は、配列内のすべての値をユニークにするために必要な最小の操作回数を返す必要があります。
例えば、次の入力が与えられたとします。
const arr = [12, 15, 7, 15];
この場合の出力は次のようになります。
const output = 1;
出力の解説
配列には 15 が 2 つ含まれています。どちらか一方の 15 を 16 に 1 だけ増やせば、配列内のすべての要素がユニークになります。これ以上少ない操作で目的を達成することはできないため、答えは 1 となります。
実装コード
この問題を解くコードは以下の通りです。
const arr = [12, 15, 7, 15];
const makeUnique = (arr = []) => {
arr.sort((a, b) => a - b);
let count = 0;
for (let i = 1; i < arr.length; i++) {
if (arr[i] <= arr[i - 1]) {
const temp = arr[i];
arr[i] = arr[i - 1] + 1;
count += arr[i] - temp;
}
}
return count;
};
console.log(makeUnique(arr));
コードの解説
このアルゴリズムは貪欲法(グリーディ法)に基づいており、以下の手順で動作します。
1. 配列を昇順にソートする
arr.sort((a, b) => a - b) により配列を昇順に並べ替えます。ソートしておくことで、重複や順序の逆転は必ず隣接する要素間で発生するため、一度の走査ですべて検出できます。
2. 隣接要素を比較して値を引き上げる
先頭から順に各要素 arr[i] を確認し、直前の要素 arr[i - 1] 以下であれば、arr[i - 1] + 1 まで値を引き上げます。これにより、その時点で最小限の増加量だけで重複を解消できます。
3. 操作回数を累積する
値を引き上げた量(元の値との差分)を count に加算していき、最終的な count が最小操作回数となります。
計算量
ソートに O(n log n)、その後の走査に O(n) かかるため、全体の計算量は O(n log n) です。空間計算量は入力配列をそのまま利用するため O(1)(ソートを除く)で済みます。
出力結果
上記のコードをコンソールで実行すると、次の結果が出力されます。
1
このように、ソートと貪欲法を組み合わせることで、配列をユニークにするための最小操作回数を効率的に求められます。
-
JavaScriptの基本配列メソッド解説!push・pop・shift・unshift・spliceの使い方を実例付きで紹介
JavaScriptには、配列を操作するための便利な組み込みメソッドが数多く用意されています。その中でも特によく使われるのが、要素の追加や削除を行う以下の5つの基本メソッドです。 JavaScriptの主要な配列メソッド一覧 メソッド説明 Array.push()配列の末尾に要素を追加します。 Array.pop()配列の末尾から要素を取り除きます。 Array.unshift()配列の先頭に要素を追加します。 Array.shift()配列の先頭から要素を取り除きます。 Array.splice()配列内の任意の位置で要素の追加・削除を行います。 これらのメソッドは、配列の
-
JavaScript配列から一意の値(重複なし)を取得する方法
JavaScriptの配列に含まれる重複した値を取り除き、一意の値(ユニークな値)だけを取得したい場合は、Setオブジェクトを使うのが最もシンプルで効率的な方法です。 Setは同じ値を1つしか格納できないデータ構造のため、配列をnew Set()に渡すだけで自動的に重複が排除されます。その後、スプレッド構文([...set])を使えば、簡単に元の配列形式へ戻すことができます。 サンプルコード 以下は、JavaScriptの配列からすべての一意の値を取得する実際のコード例です。 <!DOCTYPE html> <html lang=ja> <head> <