Mein Code hier generiert alle Kombinationen (Wiederholung eingeschlossen) der Werte in candidates
, so dass die Werte zum Ziel summieren. Dies ist meine Lösung für https://leetcode.com/problems/combination-sum/.Java-Rekursion - Ausgabe von mehreren rekursiven Aufrufen
Ich bin ein wenig verwirrt darüber, warum muss ich die folgende Zeile von Code:
currentSet = new ArrayList<>(currentSet);
Dieses es im Wesentlichen machen wird, so dass currentSet eine private Variable für alle rekursiven Aufrufe ist. Andernfalls ist currentSet eine gemeinsam genutzte Variable, die die rekursiven Aufrufe gleichzeitig ändern und zu Problemen führen. Zum Beispiel, wenn die obige Anweisung aus dem Code weggelassen, combinationSum({1, 2}, 4)
hat die folgende Ausgabe:
[[1, 1, 2], [1, 1, 1, 1], [1, 2]]
Das Array [1,2] offensichtlich summieren sich nicht auf 4. Kann jemand eine solide Erklärung liefern, warum dies Ereignis?
Auch gibt es irgendwelche Optimierungen, die ich tun könnte, damit mein Code vermeiden kann, doppelte, aber neu angeordnete Arrays, wie meine aktuelle Methode in Brute-Force-Sortierung und überprüfen, wenn in der HashSet enthalten führt zu sehr schlechten Komplexität.
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;
}
Macht Sinn. Ich danke dir sehr. – user2668836
@ user2668836 Gern geschehen :) –