https://leetcode.com/problems/combination-sum/description/
简单的回溯应用,就是第二个算法写的时候没考虑重复情况,如果排好序之后按每个值的个数依次遍历也是可以的
Combination Sum1
class Solution(object):
def combinationSum(self, candidates, target):
combination=[]
def fd(sum,min,l):
for i in candidates:
if i>=min:
if sum+i<target:
nl=l[:]
nl.append(i)
fd(sum+i,i,nl)
if sum+i==target:
nl=l[:]
nl.append(i)
combination.append(nl)
break
if sum+i>target:
break
candidates.sort()
nnl=[]
fd(0,candidates[0],nnl)
return combination
Combination Sum2
class Solution(object):
def combinationSum2(self, candidates, target):
combination=[]
nnl=[]
def fd(m,sum,l):
if m==len(candidates):
return
fd(m+1,sum,l)
if sum+candidates[m]==target:
nl=l[:]
nl.append(candidates[m])
nl.sort()
if nl in combination:
return
else:
combination.append(nl)
return
if sum+candidates[m]<target:
nl=l[:]
nl.append(candidates[m])
fd(m+1,sum+candidates[m],nl)
fd(0,0,nnl)
return combination