経験:主に使用後戻りや剪定、剪定は全体の条件が考える取らなければならない、または他の時間がより多くなります
重複排除は、よりエレガント、やろう設定することはできませんどのようにノートを取るために重い行く場所。
再帰的プロセス、条件が変化する中で再帰で処理することができ、コンパクトな状態を記述するようにしてください
再帰的な方法を記述し、治療に行き、コードのように、少量、そしてエレガント。
1 クラスソリューション{ 2 パブリックリスト<リスト<整数>> combinationSum2(INT []の候補、int型のターゲット){ 3 LinkedListの<リスト<整数>>リスト= 新しい LinkedListの<> (); 4 もし(候補== NULL || candidates.length == 0 ) 5 リターンリスト。 6 は、Arrays.sort(候補)。 7 REC(0、リスト、新しい LinkedListは<整数> ()、候補者、ターゲット)。 8 リターンリスト。 9 } 10 公衆 ボイド REC(int型のインデックス、LinkedListの<リスト<整数>>リスト、LinkedListの<整数> TMP、INT []の候補、int型のターゲット) 11 { 12 であれば(目標<0 ) 13 リターン; 14 他の 場合(目標== 0 ) 15 { 16 list.add(新しいLinkedListの(TMP))。 17 リターン; 18 } 19は、 他の 20 { 21 のためには、(int型私は=インデックスを、iが<candidates.length &&[I]は<=ターゲットに候補 ; I ++ )//この状態を改善することができるプルーニング
//速度 22である { 23は IF [I]は==に候補[!1-Iにおける(I =インデックス&&候補]) 24 続行; 25 tmp.add ([I]における候補); 26が REC(+ I. 1、リスト、TMP、で候補、標的- [I]における候補); 27 tmp.removeLast(); 28 } 29 } 30 } 31です }