2017-05-23 4 views
-3
class Solution(object): 
""" 
@param candidates: Given the candidate numbers 
@param target: Given the target number 
@return: All the combinations that sum to target 
""" 
def combinationSum2(self, candidates, target): 
    # write your code here 
    candidates.sort() 
    self.ans, tmp, use = [], [], [0] * len(candidates) 
    self.dfs(candidates, target, 0, 0, tmp, use) 
    return self.ans 
def dfs(self, can, target, p, 
     now, tmp, use): 
    if now == target: 
     print(tmp) 
     self.ans.append(tmp[:]) 
     return 
    for i in range(p, len(can)): 
     if now + can[i] <= target and (i == 0 or can[i] != can[i-1] or use[i-1] == 1): 
      tmp.append(can[i]) 
      use[i] = 1 
      self.dfs(can, target, i+1, now + can[i], tmp, use) 
      tmp.pop() 
      use[i] = 0 

s = Solution() 
can = [10, 1, 2, 7, 6, 1, 5] 
tar = 8 
print(s.combinationSum2(can,tar)) 

Wenn ich ersetzen self.ans.append (tmp [:]) mit self.ans.append (tmp), wird das Ergebnis gezeigt, wie [[], [], [], []] aber nicht das gewünschte Ergebnis.Liste hinzufügen Problems in Python zur Liste

Antwort

0

Da, wenn Sie self.ans.append(tmp[:]) tun, Sie Kopie tmp in self.ans anhängen. Wenn also tmp get in self.ans hinzugefügt wird, wird eine neue Liste tmp hinzugefügt. Auch wenn tmp später geändert wird, hat dies keine Auswirkungen auf die tatsächliche Liste, die zu self.ans hinzugefügt wurde.

Jetzt, wenn Sie self.ans.append(tmp) tun, fügen Sie nur die gleiche Liste tmp in self.ans statt seiner Kopie. Später werden alle Operationen, die unter tmp ausgeführt wurden, ebenfalls in self.ans angezeigt, da Sie nicht die Kopie tmp, sondern nur eine Referenz hinzugefügt haben. In dfs machst du tmp.pop() in der vorletzten Zeile, die nacheinander die Liste tmp leert. Deshalb haben self.ans alle tmp Listen leer.

+0

Danke für Ihre Erklärung! – user8051764