python--lintcode153. 数字组合 II

描述

给出一组候选数字(C)和目标数字(T),找出C中所有的组合,使组合中数字的和为T。C中每个数字在每个组合中只能使用一次。

  • 所有的数字(包括目标数字)均为正整数。
  • 元素组合(a1a2, … , ak)必须是非降序(ie, a1 ≤ a2 ≤ … ≤ ak)。
  • 解集不能包含重复的组合。 
您在真实的面试中是否遇到过这个题?  

样例

给出一个例子,候选数字集合为[10,1,6,7,2,1,5] 和目标数字 8  ,

解集为:[[1,7],[1,2,5],[2,6],[1,1,6]]


这一题就是上一题的升级版,上一题的解析见:https://blog.csdn.net/wenqiwenqi123/article/details/80195896

那么这一题的不同就是这一次不能重复取数字,同时解集里也不能有重复的。

不能重复取数字容易解决,只要在递归的时候把下标加一就行了。

那么会出现一个什么问题呢?比如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 combinationSum2(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)):
                if(i!=index and candidates[i]==candidates[i-1]):  #避免解集中有重复解
                    continue
                search(candidates,target,i+1,list+[candidates[i]])

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

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





s=Solution()
print(s.combinationSum2([1,1,2],3))



  • 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、付费专栏及课程。

余额充值