给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的数字可以无限制重复被选取。
说明:
所有数字(包括 target)都是正整数。
解集不能包含重复的组合。
示例 1:
输入: candidates = [2,3,6,7], target = 7,
所求解集为:
[
[7],
[2,2,3]
]
示例 2:
输入: candidates = [2,3,5], target = 8,
所求解集为:
[
[2,2,2,2],
[2,3,3],
[3,5]
]
一开始打算强写,但是没写下去
ca=candidates
ta=target
ans=[]
if ta in ca:
a=[]
a.append(ta)
ans.append(a)
for i in ca:
if ta%i==0:
con=ta//i
ans1=[]
for j in range(con):
ans1.append(i)
ans.append(ans1)
i=0
while True:
con=ans//ca[i]
for j in range(con-1,-1,-1):
chazhi=ta-j*ca[i]
if chazhi<max(ta):
break
然后就用递归了,排名29%
用[2,3,5] 8来举例
ca=candidates
ta=target
def zuhe(lists,num,start,ans,resule):
for i in range(start,len(lists)):#设置start是因为不希望重复,如果
#上一个是2,那么下一个就从[3,5]里遍历
if num>0:#如果还可以加数
ans.append(lists[i])#尝试加入列表
zuhe(lists,num-lists[i],i,ans,resule) #修改start,递归i后面的数
ans.pop()#以第i个数的递归结束,剔除。一开始肯定是[2222],经过
#[2223],[2225]的递归之后,踢出2,剩下[22],反会下一次递归,[223],[2235],再踢出,返回[225]结束本轮
elif num==0:#记录正确是序列
aa=ans[:]
resule.append(aa)
return
else:
return
return resule#每次引用都会返回一个
bb=zuhe(ca,ta,0,[],[])
return bb
然后学到了新的改进,排名96%,不用pop,也不用担心ans的问题,因为只有==target时才加入列表,其他无效的ans都舍弃了
ca=candidates
ta=target
def zuhe(lists,num,start,ans,resule):
if num==0:
resule.append(ans)
if ans and num<ans[-1]: #这一行多一个判断,如果比ans最后一个还小,因
#为是递增list,所以不用比较了
return
for i in range(start,len(lists)):
zuhe(lists,num-lists[i],i,ans+[lists[i]],resule)
return resule
ca.sort()#这一行还是要的,和ans[-1]匹配
bb=zuhe(ca,ta,0,[],[])
return bb