[Leetcode][python]Combination Sum II/组合总和 II

探讨在含有重复元素的数组中寻找特定目标值的所有可能组合,确保组合唯一且按升序排列。通过递归方法实现,并采取去重策略避免重复解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意

在一个数组(存在重复值)中寻找和为特定值的组合。+

注意点:

所有数字都是正数
组合中的数字要按照从小到大的顺序
原数组中的数字只可以出现一次
结果集中不能够有重复的组合

解题思路

这道题和 Combination Sum 极其相似,主要的区别是Combination Sum中的元素是没有重复的,且每个元素可以使用无限次;而这题中的元素是有重复的,每个元素最多只能使用一次。

代码

更改上一题代码:
1. 将candidates[i:]变为candidates[i+1:]
2. 再加入flag让后面不必要的累加提前结束(上一题也适用,后来想到的)
3. 最后结果有重复,去重

class Solution(object):
    def combinationSum2(self, candidates, target):
        """
        :type candidates: List[int]
        :type target: int
        :rtype: List[List[int]]
        """
        if not candidates:
            return []
        candidates.sort()
        result = []
        self.combination(candidates, target, [], result)
        new_result = []
        for res in result:
            if res not in new_result:
                new_result.append(res)
        # print new_result
        return new_result

    def combination(self, candidates, target, current, result):
        # print 'candidates', candidates
        if current:
            # print 'current:', current
            s = sum(current)
        else: 
            s = 0
        if s > target:
            return 1 # 从这里结束匹配不了的循环
        elif s == target:
            # print 'result:', current
            result.append(current)
            return 1
        else:
            for i, v in enumerate(candidates):
                # print i, v
                flag = self.combination(candidates[i+1:], target, current + [v], result)
                if flag == 1:
                    break

总结

事后在想能不能直接用set存储,这样就不用去重了,但是应该不行,因为set的key不能使可变对象,而慢慢累加的list是不能用tuple来代替存储的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值