説明
地址:https://leetcode.com/problems/combination-sum-ii/
候補番号(候補)の収集と目標数(ターゲット)を考えると、ターゲットに候補者候補数の合計のすべてのユニークな組み合わせを見つけます。
候補者のそれぞれの数は組み合わせのみで一度使用することができます。
注意:
(ターゲットを含む)すべての数値は、正の整数になります。
ソリューションセットは、重複の組み合わせを含めることはできません。
例1:
Input: candidates = [10,1,2,7,6,1,5], target = 8,
A solution set is:
[
[1, 7],
[1, 2, 5],
[2, 6],
[1, 1, 6]
]
例2:
Input: candidates = [2,5,2,1,2], target = 5,
A solution set is:
[
[1,2,2],
[5]
]
ソリューション
ソリューション:
- 昇順に配列を与え、
- 遡及的な方法で(どちらか選択する選択するか、ではありません)。
- ときに
target == 0
キューに追加するとき(クローン方法を最後のオブジェクトが空であるため、オブジェクトは、インデックス付きのようにすることはできません)。 if (i > start && candidates[i] == candidates[i - 1])
この状態を解決するための特別裁判官は、最初の数字は前と同じにすることはできません表し、例えば、2 1があり、その後[1, 2, 5], [1,7]
、2があるでしょう。まず、1から始まり、2番目は2で始まります。あなたは法律をデバッグ見つけることができるはずです。
package backtracking;
import java.util.*;
// https://leetcode.com/problems/combination-sum-ii/
public class CombinationSumII {
public static void main(String[] args) {
CombinationSumII obj = new CombinationSumII();
int[] candidates = {10,1,2,7,6,1,5};
int target = 8;
List<List<Integer>> resultList = obj.combinationSum2(candidates, target);
System.out.println("resultList >> " + Arrays.toString(resultList.toArray()));
}
public List<List<Integer>> combinationSum2(int[] candidates, int target) {
List<List<Integer>> resultList = new ArrayList<>();
Arrays.sort(candidates);
recursive(candidates, target, resultList, new ArrayList<Integer>(), 0);
return resultList;
}
public void recursive(int[] candidates, int target, List<List<Integer>> resultList, List<Integer> list, int start) {
if (target == 0) {
List<Integer> newList = new ArrayList<Integer>(list);
resultList.add(newList);
} else if (target > 0) {
for (int i = start; i < candidates.length && target >= candidates[i]; i++) {
// remove duplicate
if (i > start && candidates[i] == candidates[i - 1]) {
continue;
}
list.add(candidates[i]);
recursive(candidates, target - candidates[i], resultList, list, i + 1);
list.remove(list.size() - 1);
}
}
}
}