説明
トピック住所:https://leetcode.com/problems/combination-sum/
(重複なし)候補番号(候補)のセットと、目標数(ターゲット)を考えると、ターゲットに候補者候補数の合計のすべてのユニークな組み合わせを見つけます。
同じ繰り返し回数が候補数は無制限から選択することができます。
注意:
- (ターゲットを含む)すべての数値は、正の整数になります。
- ソリューションセットは、重複の組み合わせを含めることはできません。
例1:
Input: candidates = [2,3,6,7], target = 7,
A solution set is:
[
[7],
[2,2,3]
]
例2:
Input: candidates = [2,3,5], target = 8,
A solution set is:
[
[2,2,2,2],
[2,3,3],
[3,5]
]
ソリューション
アイデア;繰り返すことがないように選択することができ、繰り返しの選択された候補のソート配列は、候補選択の各要素を加えることができる、しないことを選んでもよいです。それだけで戻って使用するものではなく、また、リサイクルのために使用します。二つの条件:
target == 0
クローンとこのリストは、インデックスリストならば、結果が出て変更される結果のリスト、ノートにリストを入れてください。resultList.add(new ArrayList<>(list))
target > 0
現在の要素に参加するか否かを判断します。
package backtracking;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
// https://leetcode.com/problems/combination-sum/
public class CombinationSum {
public static void main(String[] args) {
CombinationSum obj = new CombinationSum();
int[] candicates = {2, 3, 6, 7};
int target = 7;
List<List<Integer>> resultList = obj.combinationSum(candicates, target);
System.out.println(Arrays.toString(resultList.toArray()));
}
public List<List<Integer>> combinationSum(int[] candidates, int target) {
List<List<Integer>> resultList = new ArrayList<>();
Arrays.sort(candidates);
recursive(candidates, target, 0, new ArrayList<>(), resultList);
return resultList;
}
public void recursive(int[] candidates, int target, int start, List<Integer> list, List<List<Integer>> resultList) {
if (target > 0) {
for (int i = start; i < candidates.length && target >= candidates[i]; i++) {
list.add(candidates[i]);
recursive(candidates, target - candidates[i], i, list, resultList);
list.remove(list.size() - 1);
}
} else if (target == 0) {
resultList.add(new ArrayList<>(list));
}
}
}