2017-05-23 18 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)) 

self.ans.append(tmp [:])をself.ans.append(tmp)に置き換えた場合、結果は[[]、[]、 []、[]]しかし私が望む結果ではない。リストにリストを追加するPython

答えて

0

あなたがself.ans.append(tmp[:])行うとき、あなたはself.anstmpのコピーを追加しているので。したがって、tmp getをself.ansに追加すると、新しいリストtmpが追加されます。したがって、tmpが後で変更されても、self.ansに追加された実際のリストには影響しません。

self.ans.append(tmp)を実行すると、その代わりに同じリストtmpself.ansに追加するだけです。したがって、後でtmpで行われたすべての操作は、tmpのコピーを追加していないので、self.ansに反映されます。 dfsでは、最後の2行目にtmp.pop()を実行しています。これは、リストtmpを連続して空にします。だからself.ansにはすべてtmpのリストが空になっています。

+0

あなたの説明をありがとう! – user8051764

関連する問題