组合总和||

该博客讨论了一个使用深度优先搜索(DFS)解决组合问题的算法。在给定一个包含重复元素的整数数组和一个目标值的情况下,算法通过排序数组、避免重复元素和利用集合来存储唯一组合。博客重点介绍了如何将列表转换为元组以适应集合操作,并在DFS完成后将结果转换回列表。整个过程中,元组的使用确保了集合内的唯一性。
摘要由CSDN通过智能技术生成

在这里插入图片描述
难点:注意list是可变元素,所以不能加入到set集合中,所以把list变成tuple加入到set中,dfs完了再把再把里面的元组变成list,然后把集合ans变成list

注意这种情况下使用tuple元组,通常需要对原来的数组进行排序。

class Solution:
    def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]:
        candidates.sort()
        ans=set()
        n=len(candidates)
        def dfs(index,num,ant):
            if ant==target:
                ans.add(tuple(num))#在这里变成元组,加入到集合set中,最后dfs完了
                #再把元组变成list,然后把集合变成list
            if(index==n):
                return

            for i in range(index,n):
            #注意这里的剪枝
                if i>index and candidates[i]==candidates[i-1]:
                    continue
                if candidates[i]+ant>target:
                    break
                num.append(candidates[i])
                dfs(i+1,num,candidates[i]+ant)
                num.pop(-1)

        dfs(0,[],0)
        ans=list(map(list,ans))
        return ans
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值