毎日磨いていないが、それでもタイトル、(マニュアルナゲットを変更する必要はありませんが、
タイトルと電源ボタン(LeetCode)からソリューション、ポータル。
アルゴリズム(78) :
すべての可能なサブセット(パワー設定)の配列を返す配列NUMS整数ない繰り返し要素のセットを与えられました。
説明:ソリューションセットの重複サブセットを含めることはできません。
例:
入力:NUMS = [1,2,3]
出力
:
[ [3]、
[1]、
[2]、
[2,3]、
[1,3]、
[2,3]、
[1,2 ]、
[]
]
この質問は、私は本当に私たちが解決するためのサイクルを使用することを願って、任意のより良いアイデアを開始しますが、読み取りの取り扱い、読んで、いくつかのより/あまりにも多くのサイクルが入れ子になっていませんでした。友人はバックトラック、それの溶液を見て一緒に来ます:
1 パブリック クラスソリューション{ 2 // バックトラック 3。 専用のIList <のIList < INT >> RES; 4 プライベート ボイド検索(INT [] NUMS、int型開始、のIList < INT > PRE) 5 { 6。 // 明示的な再帰終了 。7 res.Add(新しい一覧< 整数 >(前)); // 注:新しいにこちらをクリックしてください 8。 のための(int型 I =始める; I <nums.Length; I ++ ) 9。 { 10 pre.Add(NUMS [I]); 11。 検索(NUMS、I + 1 ; PRE) 12は pre.RemoveAt(pre.Count - 1。); // の組み合わせ問題、リセット終了後の再帰状態 13 } 14 } 15 公共のIList <のIList < INT >>サブセット(INT [] NUMS) 16 { 17。 INT LEN = nums.Length; 18は RES = 新しい新しいリスト<のIList < INT >> (); 19 IF(== lenは0 ) 20 { 21 リターンのres; 22 } 23 のIList < INT >予備= 新しいリスト< 整数 > (); 24 検索(NUMS、0 、PRE)。 25 リターンのres; 26 } 27 }
検索しようとする過程で解を求める問題、別のパスを試すに戻る「戻る」で、条件が満たされていない解決されていることが見いださ:バックトラックは、一般的なプロセスです。バックトラックは前方の目標を達成するために最適な選択条件で検索し、最適な選択の検索方法です。しかし、探索するステップは、オリジナルの選択が優れていないか、その目標を達成するために発見したときに、それが再選択し、この死者バックトラックの戻り歩行技術の端、およびいくつかの点状態条件での素敵なバックにステップバックでいわゆる「バックトラックポイント。」
私たちは、findメソッドでは、実際には、上記の方法に4〜14行のフォーカスを返します。この方法は、実際には2つだけ、解像度の出力結果のコレクションに1を追加します。データの次のセットを準備します。2.。私たちは、データの次のセットを準備する方法を見てみ焦点を当てました。全体元の終了条件が設定されている横断、ループの開始の指標で定義されました。メモセットの数が実際に離間の配列である行10〜12、すなわち。ああ、もし我々例えば、[0、1]にこのコレクションその表現のために。[]、[0]、[0,1]、[0,1]、[0,2]、[1]、[2]、[2](注:これは、すべてのサブセットです。ここで、上記のコードは、この順序で入力)配列であるサブセットは、結果セット内の空のセットに追加され、セット1のサブセットの数は、第1層の呼び出しが見つけるためときに見つけるための第2の層の呼び出しでありますそれに追加しました。ここで理解し、それを理解するのは容易でなければならない理由を12行pre.RemoveAt(pre.Count - 1);