python--lintcode135. 数字组合

描述

给出一个候选数字的set(C)和目标数字(T),找到C中所有的组合,使找出的数字和为T。C中的数字可以无限制重复被选取。

例如,给出候选数组[2,3,6,7]和目标数字7,所求的解为:

[7],

[2,2,3]

  • 所有的数字(包括目标数字)均为正整数。
  • 元素组合(a1a2, … , ak)必须是非降序(ie, a1 ≤ a2 ≤ … ≤ ak)。
  • 解集不能包含重复的组合。

样例

给出候选set[2,3,6,7]和目标数字7

返回 [[7],[2,2,3]]

 

题目意思很明确了,这就是一个排列组合的问题,请注意,所有排列组合的问题,都用dfs来做!

这一题跟我写的上一题有类似的地方,详情请看:https://blog.csdn.net/wenqiwenqi123/article/details/80024729

但是因为这一题允许元素重复,所以下标在递归的时候不需要加一,具体代码如下:

 

<span style="color:#000000">class Solution:
    """
    @param candidates: A list of integers
    @param target: An integer
    @return: A list of lists of integers
    """
    def combinationSum(self, candidates, target):
        # write your code here
        def search(candidates,target,index,list):
            if(sum(list)==target):
                self.result.append(list)
                return
            if(index==len(candidates)):
                return
            if(sum(list)>target):
                return
            for i in range(index,len(candidates)):
                search(candidates,target,i,list+[candidates[i]])

        if(len(candidates)==0):
            return []

        self.result=[]
        list=[]
        search(sorted(candidates),target,0,list)

        return self.result





s=Solution()
print(s.combinationSum([2,3,7],7))</span>

更新于2021.05.10 。我在两年后再刷这一题的时候发现给定的candidates不是set了,也就是说里面可能会出现重复的元素。

那么会出现一个什么问题呢?比如C=[1,1,2],T为3的时候,若是用之前的方法,则解集里会有两组解[1,2]与[1,2],第一个解中的1为C中第一个1,第二个解中的1为C中第二个1.为了避免这样的问题,其实只需要两行代码:

class Solution:
    """
    @param candidates: A list of integers
    @param target: An integer
    @return: A list of lists of integers
    """
    def combinationSum(self, candidates, target):
        # write your code here
        if (len(candidates)==0):
            return []

        self.results=[]

        self.search(sorted(candidates),[],target,0)
        return self.results

    def search(self,candidates,S,target,index):
        # if candidates[index]==target:
        #     self.results.append(S+[candidates[index]])
        #     return
        if 0==target:
            self.results.append(S)
            return
        if (index==len(candidates)):
            return

        if candidates[index]>target:
            return
        for i in range(index,len(candidates)):
            # 避免重复解
            if (i!=index and candidates[i]==candidates[i-1]):
                continue
            self.search(candidates,S+[candidates[i]],target-candidates[i],i)
        # self.search(candidates,S+[candidates[index]],target-candidates[index],index+1)




# candidates = [2,3,6,7]
# target = 7
candidates = [2,2,3]
target = 5
s = Solution()
print(s.combinationSum(candidates,target))

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哎呦不错的温jay

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值