力扣 39. 组合总和 递归解法

39. 组合总和
给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,
找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,
并以列表形式返回。你可以按 任意顺序 返回这些组合。
candidates 中的 同一个 数字可以 无限制重复被选取 。
如果至少一个数字的被选数量不同,则两种组合是不同的。 
对于给定的输入,保证和为 target 的不同组合数少于 150 个。

示例 1:

输入:candidates = [1,3,6,7]
target = 7
输出:[[2,2,3],[7]]
解释:
2 和 3 可以形成一组候选,2 + 2 + 3 = 7 。注意 2 可以使用多次。
7 也是一个候选, 7 = 7 。
仅有这两种组合。

示例 2:

输入: candidates = [2,3,5]
target = 8
输出: [[2,2,2,2],[2,3,3],[3,5]]

示例 3:

输入: candidates = [2]
target = 1
输出: []

题解:举例说明 i 为数组指针,x 为此时指向元素 result 为结果

cur+[x] 表示所走过的所有数字

元素可以重复利用,则每次遍历一个元素,并求出此时的余数作为新的目标值,
      如果余数(新目标)比这个数子大,则再次从这个元素开始遍历
      如果新目标等于这个数字则加入到结果列表
      否则跳出
           3 4 5 6 7 8 9 10   target=7
           
        i  x    new_target    result
        0  3      7-3=4           []
            (此时  3<4 则进入递归)
           3      4-3=1           []
             (3>1 跳出回到上一层,i指针移动)
          
        1  4        4           [3,4]
           (跳出回到上一层,i指针移动)
           
        2  5      7-5=2         [3,4]
           (5>2 跳出回到上一层,i指针移动)  
        3  6      7-6=1         [3,4]
           (6>1 跳出回到上一层,i指针移动) 
        4  7       target=7     [[3,4],[7]]
     此上步骤主要为演示递归过程,小于target才会进入递归,产生new_target,
     省略初始与target判断 即 recursive(0,target,[]) 这条代码
class Solution(object):
    def combinationSum(self, candidates, target):
        """
        :type candidates: List[int]
        :type target: int
        :rtype: List[List[int]]
        """
        # 排序,便于后续判定,若后面的值大于target直接停止
        nums=sorted(candidates)
        self.res=[]
        # 定义递归函数
        """
        元素可以重复利用,则每次遍历一个元素,并求出此时的余数作为新的目标值,
        如果余数(新目标)比这个数子大,则再次从这个元素开始遍历
        如果新目标等于这个数字则加入到结果列表
        否则跳出

        """
        def recursive(j,new_target,cur):
            # 当指针移动,则重新开始,第一次进来的new_target就是target
            # 相当与先进行一次,单个值与target的判断
            for i in range(j,len(nums)):
                x=nums[i]
                if x <new_target:
                    recursive(i,(new_target-x),cur+[x])
                else:

                    if x ==new_target:
                        self.res.append(cur+[x])
                    break
        recursive(0,target,[])
        return self.res

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

01_

感谢支持

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

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

打赏作者

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

抵扣说明:

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

余额充值