問題:重複要素を含む配列から、各要素を最大1回使用して目標値に達する全ての一意な組み合わせを見つける
手法:バックトラッキング + ソート + 重複スキップ
時間計算量: O(2^n) - 最悪の場合、各要素について選ぶ/選ばないの2択
空間計算量: O(target) - 再帰の深さは最大でtargetの値まで
元の配列: [10,1,2,7,6,1,5]
重複要素(1)が分散している状態
ソート済み: [1,1,2,5,6,7,10]
重複要素が隣接し、効率的な剪定が可能
Target = 8 の場合の探索ツリーを可視化:
条件解説:
i > startIndex: 最初の要素ではないcandidates[i] === candidates[i - 1]: 前の要素と同じ値
配列 [1,1,2] で target=3 の場合:
スキップなし: [1,2], [1,2] → 重複!
スキップあり: [1,2] → 一意!
同じレベルでの重複要素使用を防ぎ、結果の一意性を保証
実際にアルゴリズムの動作を体験してみましょう:
currentSum > target の場合、即座に探索を中断
ソート済み配列により、以降の要素も必ず target を超えるため効果的
バックトラッキングによる状態復元でメモリ使用量を最小化
O(1) 時間での重複検出により、不要な計算を回避