Leetcode-39-组合总和 (python)

题目

给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。

candidates 中的数字可以无限制重复被选取。

输入: candidates = [2,3,6,7], target = 7,
所求解集为:
[ [7],[2,2,3]]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/combination-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法

看起来很复杂,使用递归总体思想很简单:

  1. 要选择第一个元素, 这个元素仍然可以重复多次选择:combinationSum(candidates[0:], target-candidates[0])
  2. 不选择第一个元素, 由于没有重复的元素,这个元素不会再被选择了:
    combinationSum(candidates[1:], target)
    上面的每种情况又分别包含了选择第二个元素和不选第二个元素的情况, 依次递归.

停止条件:

  1. target 为0, 和清除掉符合要求的元素以及大于target的元素之后,candidate为空了.
    2.记录下刚好等于target的结果,为成功搜索.

代码

class Solution(object):
    def combinationSum(self, candidates, target):
        """
        :type candidates: List[int]
        :type target: int
        :rtype: List[List[int]]
        """
        if target<=0 or len(candidates)==0:
            return []
        res = []
        for i in candidates[: : -1]:
            # 某一个元素和target 相等了
            if i==target:
                res.append([i])
                candidates.remove(i)
            # 清除大于target的元素
            elif i>target:
                candidates.remove(i)
        # 当candidate中已经没有元素的时候
        if len(candidates)==0:
            return res
        # 某次选择一个元素或者不选
        # 选当前元素
        tmp = self.combinationSum(candidates[0:], target-candidates[0])
        for j in tmp:
                res.append([candidates[0]]+j)
        tmp1 = self.combinationSum(candidates[1:], target)
        for j in tmp1:
                res.append(j)
        return res
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值