Leetcode做题日记:40. 组合总和 II(PYTHON)

给定一个数组 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值