Combination Sum

leetcode第39题,回溯题,要求用给定集合中的数字使得相加等于目标数字,其中给定集合中的数字可以无限次使用。

注意,这里题目要求所有数字都是正数,这就保证了递归的出口条件。

分析问题,首先,递归的出口条件有两个,一个是相加出现了目标和,那么就加入了结果列表,返回。另外,由于给定集合都是正数,所以相加如果超过了目标和,就要立即返回。然后遍历集合,不断向下递归搜索。

还有一个比较关键的问题,就是如何去重。这里我们先把目标集合排一下序,然后在递归搜索的时候先判断要加入的数字和之前列表中最后一个数字的大小关系,这样就确保了我们搜索出来的结果一定是一个递增的关系,这样就会不会重复了。

class Solution(object):
    def combinationSum(self, candidates, target):
        """
        :type candidates: List[int]
        :type target: int
        :rtype: List[List[int]]
        """
        n = len(candidates)
        candidates.sort()
        ans = []
        def dfs(tryList):
            if sum(tryList) == target:
                ans.append(tryList)
                return
            if sum(tryList) > target:
                return
            for i in range(n):
                if len(tryList) != 0 and  candidates[i] < tryList[-1]:
                    continue
                dfs(tryList+[candidates[i]])
        dfs([])
        return ans


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值