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

给定一个无重复元素的数组 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

你可能感兴趣的:(leetcode,Leetcode)