39.组合总数

这篇博客介绍了如何运用回溯算法来找到给定数组中所有加起来等于目标值的组合。博主通过代码实例展示了如何在Python中实现回溯,并讨论了如何利用剪枝策略减少重复组合,提高效率。博客还提到了《三数之和》问题中的类似去重方法,通过调整搜索范围避免重复计算。
摘要由CSDN通过智能技术生成

在这里插入图片描述

想到了回溯,但是具体不知道怎么写,看参考链接回溯算法 + 剪枝(回溯经典例题详解)

  • 回溯/DFS
    在这里插入图片描述
  • 去重
    在这里插入图片描述
    在这里插入图片描述
    这句话点醒了我,原篇写的真好。
class Solution:
    def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
        # 所有的组合->想到回溯,不同组合->去重(因为每次dfs就会列出包含该元素的所有结果,所以在二叉树同层的右边直接就不要考虑前面dfs过的数了)
        # 参考链接中说《三数之和》也是这样去重的,之前是通过排序+双指针做的,而这个左边的指针就是从当前索引开始的,而不是0。这样去重的。
        self.clen = len(candidates)
        self.res = []
        self.candidates = candidates
        def backtrack(combination, target, pivot):
            if target == 0: 
                self.res.append(combination)
                return
            if target < 0: return
            for i in range(pivot, self.clen):
                backtrack(combination+[self.candidates[i]], target-self.candidates[i],i)

        backtrack([], target, 0)
        return self.res


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值