给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的每个数字在每个组合中只能使用一次。
说明:
所有数字(包括目标数)都是正整数。
解集不能包含重复的组合。
示例 1:
输入: candidates = [10,1,2,7,6,1,5], target = 8,
所求解集为:
[
[1, 7],
[1, 2, 5],
[2, 6],
[1, 1, 6]
]
示例 2:
输入: candidates = [2,5,2,1,2], target = 5,
所求解集为:
[
[1,2,2],
[5]
]
依旧是递归,i+1表明一个数字只能使用一次,注意进入新的递归的时候,一定要先判断条件,不然一上来就for循环,有可能不会执行,会导致少值
排名18%
def zuhe(lists,num,start,ans,resule):
if num>0 :
for i in range(start,len(lists)):#一开始这句话我写在if上面,然后原本可行的
#答案在range(n,n)之后直接结束,没法添加到ans
ans.append(lists[i])
zuhe(lists,num-lists[i],i+1,ans,resule)#探遍ans的各种分支
ans.pop()#探索完这个lists[i]后,pop,继续添加下一个值,继续递归
elif num==0:
aa=ans[:]
if aa not in resule:#会得到有很多重复的值
resule.append(aa)
return
else:
return
return resule
candidates.sort()#排序之后,就不会出现[1,7]和[7,1]了,好排除重复
resule=[]
bb=zuhe(candidates,target,0,[],resule)
return bb
进一步优化,如果不想要pop,可修改函数里这项ans+[lists[i]],ans是列表,所以直接添加元素要加[ ],这样就不用pop了
zuhe(lists,num-lists[i],i+1,ans+[lists[i]],resule)
最后,优化成这样,但是永远返回null,不知道哪里错了
def zuhe(lists,num,start,ans,resule):
if num==0 and ans not in resule:
resule.append(ans)
return
for i in range(start,len(lists)):
if lists[i]>num:#去掉这个if,在外围添加if num<0:return
#就能工作
#但这句if不就是拒绝num<0的吗?不是很明白
return
zuhe(lists,num-lists[i],i+1,ans+[lists[i]],resule)
return resule
candidates.sort()
resule=[]
bb=zuhe(candidates,target,0,[],resule)
return bb
我想应该是同时执行了for 和return 两个语句,那么直接返回[ ]是情有可原的,于是,我试图删除最后的return resule ,那么相当于在函数zuhe之前设置resule=[ ],经过函数处理,会在resule添加相应的项,最后返回resule
排名77%
def zuhe(lists,num,start,ans,resule):
if num==0 and ans not in resule:
resule.append(ans)
return
for i in range(start,len(lists)):
if lists[i]>num:return#这部优化了10倍,如果大于num就表明不用
#这轮不用再递归了,退
zuhe(lists,num-lists[i],i+1,ans+[lists[i]],resule)
#return resule
candidates.sort()
resule=[]
zuhe(candidates,target,0,[],resule)
return resule