leetcode专题训练 39. Combination Sum

这道题是一道递归的题,递归终止条件是加和为target。
以题目中的输入为例,candidates = [2,3,5], target = 8
首先往结果列表中加入2,列表就变为了[2],那么现在的target就是6,那么问题就变为了candidates = [3,5], target = 6这个问题了。而由于结果中元素可以重复,所以要重复加很多次相同元素,直到当前加和大于target。依次递归,直到求到和为target的列表序列。
这道题还涉及到剪枝,我这里用了两个剪枝。

  1. 求target的时候,不能用比上层递归时用的元素小的元素,所以我这里将candidates进行了排序,在每次递归时将candidates切片,从而去掉比上层递归时用的元素小的元素。
  2. 当candidates中最小的元素都比target要大的时候,直接剪枝。
class Solution:
    def solve(self, candidates: List[int], target: int) ->List[List[int]]:
        l = len(candidates)
        tmp = 0  #用于储存当前的加和数值
        tmp_l = []  #用于储存当前list
        result = []
        for i in range(l):
            tmp = 0
            tmp_l = []
            while tmp < target:
                tmp += candidates[i]
                tmp_l.append(candidates[i])
                if tmp == target:
                    result.append(tmp_l)
                    continue
                if i != l - 1 and target-tmp < candidates[i]:  #剪枝
                    break
                res_l = self.solve(candidates[i+1: ], target-tmp)
                if res_l:
                    for res in res_l:
                        result.append(tmp_l+res)
        return result
                        

    def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
        candidates.sort()
        solution = Solution()
        result = solution.solve(candidates, target)
        return result
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值