-40の特別なバックトラックLeetcode。全組成物II(組合せ合計II)
配列を指定 candidates
し、目標数を target
、見つける candidates
すべての数字をとのために作ることができます target
組み合わせ。
candidates
各番号は、各組み合わせで一度使用することができます。
説明:
- (目標数を含む)すべての数値は正の整数です。
- ソリューションセットは、重複の組み合わせを含めることはできません。
例1:
入力:=において候補[10,1,2,7,6,1,5]
、=目標は8
、 セットが解決される: [ [1,7]、 [1、2、5]、 [2,6]、 [1,1]、[6] ]
例2:
入力:候補= [2,5,2,1,2]、目標 = 5は、 セットが解決される: [ [1,2,2]、 [5] ]
と同様タイトル(Leetcode.39)を保持:分析違いは、この問題は一度だけ、各番号を使用することができるということです。それでも同じ考え(バックトラック)、
ターゲットの最初の注文をスキップよりも大きいです。
バックトラック- >例
候補=[10,1,2,7,6,1,5]
、ターゲット=8 , 排序后candidates = [1,1,2,5,6,7,10]
首先,入口是dfs(index=0)
选第一个1,这里我们标记为step1,
接着继续选取第二个1,标记为step2,
继续选2,step3,
选5,标记为step4,
此时已超出target=8(此时为9),故大于了target,根据代码return到上一步,返回到step4,不选5,选6
超出,退回,不选6,选7,超出,退回,选10,超出,退回。(我的AC代码里在后面还是循环了,所以浪费了很多时间,可以发现大于的就直接返回,不进入下一步了)
以此类推。因此第一个产生出来的答案应该是 1 2 5
ACコード:
クラスのソリューション{ リスト <リスト<Integer型>> ANS = 新しい ArrayListを<> (); 公衆リスト<リスト<整数>> combinationSum2(INT []の候補、int型のターゲット){ は、Arrays.sort(候補)。 DFS(候補者、ターゲット、 0、ターゲット、新しいのArrayList <Integer型> ()); 戻るANSを。 } 公共 ボイド DFS(INT []の候補、int型のターゲット、int型のインデックス、int型のバランス、のArrayList <整数> リスト){ 場合(バランス<0){ 返します。 } であれば(バランス== 0 ){ もし ans.add((ans.contains(リスト)!)新規のArrayList <整数> (リスト))。 返します。 } 場合(インデックス> = candidates.length){ 返します。 } INT NUM = 候補[インデックス]。 list.add(NUM)。 DFS(候補者、ターゲット、インデックス + 1、balance- NUM、リスト)。 list.remove(はlist.size() -1 )。 DFS(候補者、ターゲット、インデックス +1 、バランス、リスト)。 } }