重複要素を含む配列から一意な順列を生成するアルゴリズムです。バックトラッキングと重複スキップ技法を使用します。
重複要素を隣接させるため、まず配列をソートします。
同じ値の要素が隣接配置されます
各レベルで利用可能な要素を選択し、重複をスキップしながら順列を構築します。
同じ値を持つ要素群で、使用順序を制御することで重複順列を防ぎます。
条件の意味:
nums[i] === nums[i-1]: 前の要素と同じ値!used[i-1]: 前の同じ値の要素がまだ未使用選択→探索→取り消しのサイクルで全パターンを効率的に探索します。
current = [1], used = [true, false, false]
current = [1,1], used = [true, true, false]
result.push([1,1,2]) → バックトラック開始
current = [1], used = [true, false, false]
入力 [1,1,2] に対する全ての一意な順列:
総数: 3個 (重複なし版では6個 → 重複除去により3個)
| 手法 | 時間計算量 | 空間計算量 | 重複処理 |
|---|---|---|---|
| 全順列生成 + Set除去 | O(n! × n) | O(n! × n) | 後処理 |
| 本手法 | O(n! × n) | O(n) | 事前回避 |
異なる入力での動作を確認してみましょう: