私のコードは、candidates
の値のすべての組み合わせ(繰り返しを含む)を生成し、値が合計されるようにします。これはhttps://leetcode.com/problems/combination-sum/の解決策です。 Java再帰 - いくつかの再帰呼び出しからの出力
currentSet = new ArrayList<>(currentSet);
これは、本質的にそれを行います。それ以外の場合、currentSetは、再帰呼び出しが同時に変更されて問題が発生する共有変数になります。上記のステートメントがコードから省略されている場合たとえば、 combinationSum({1, 2}, 4)
は、次の出力があります。
[[1, 1, 2], [1, 1, 1, 1], [1, 2]]
配列[1,2]、明らかに4にまとめるありませんこれは、なぜ誰もがソリッドな説明を提供することができますハプニング?
また、HashSetに含まれていれば、現在のブルートフォースソートとチェックの方法が非常に複雑になるため、私のコードでは重複して並べ替えられない配列を避けることができます。
public List<List<Integer>> combinationSum(int[] candidates, int target) {
Set<List<Integer>> returnSet = new HashSet<>();
returnSet = combSum(candidates, target, 0, returnSet, new ArrayList<Integer>());
return new ArrayList<>(returnSet);
}
private Set<List<Integer>> combSum(int[] candidates, int target, int i, Set<List<Integer>> returnSet,
List<Integer> currentSet) {
currentSet = new ArrayList<>(currentSet);
if(i == target) {
Collections.sort(currentSet);
if(!returnSet.contains(currentSet)) {
returnSet.add(new ArrayList<Integer>(currentSet));
}
} else if(i <= target){
System.out.println("Current set: " + returnSet.toString());
System.out.println("Current sum: " + i + " current target: " + target);
for(int a: candidates) {
if(i + a <= target) {
System.out.println("\tAdding: " + a + " so that the new sum will be: " + (i + a));
currentSet.add(a);
returnSet = combSum(candidates, target, i + a, returnSet, currentSet);
currentSet.remove(currentSet.size() - 1);
}
}
}
return returnSet;
}
理にかなっています。どうもありがとうございます。 – user2668836
@ user2668836あなたは大歓迎です:) –