40. 组合总和 II

1、相比于正常的回溯算法,多了一个index参数,主要是用来后面的数层去重,树枝不去重

2、递归中的i+1的作用是用过这个元素之后,下次就不用了

3、path[:]的作用和path.copy()的作用相同

class Solution(object):
    def combinationSum2(self, candidates, target):
        """
        :type candidates: List[int]
        :type target: int
        :rtype: List[List[int]]
        """
        def trace(path, index):
            if sum(path) > target:
                return
            if sum(path) == target:
                res.append(path[:])
            else:
                for i in range(index, n):
                    if candidates[i] == candidates[i - 1] and i > index: 
                        continue
                        # 这里比较抽象,不太懂,这里我的理解:
                        # 1、candidates[i] == candidates[i - 1]表示这一层如果有相同的元素,那么在这些重复元素的前一个元素的下一层已经包含了他们
                        # 2、i > index这个不太理解
                    else:
                        path.append(candidates[i])
                        trace(path, i + 1)
                        path.pop()

        candidates.sort()
        res = []
        n = len(candidates)
        trace([], 0)
        return res
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值