【Leetcode 39】组合总和

本文介绍了一种使用回溯法解决组合求和问题的算法,通过递归搜索所有可能的组合来达到目标值。以candidates=[2,3,6,7]和target=7为例,详细解释了如何通过回溯法找出所有可能的组合,避免重复并优化搜索过程。

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

题目描述

在这里插入图片描述在这里插入图片描述

解题思路

解法一:回溯法

在这里插入图片描述
比如:candidates = [2,3,6,7],target = 7

  1. 找到全是2的组合是否能组成7,如果7-2-2-2!=0,则跳出循环,寻找2和下一个数的组合
  2. 7-2-2-3=0,则接着找7-2-3之后列表中是否有满足的,由于列表进行了排序,发现7-2-3-2!=0,第一个数2不行就直接跳出,后面的3,6,7就不用再验证
  3. 找到全为3的组合是否能组成7,此时直接从下标为1的数开始找,避免找到重复的组合,7-3-3-3!=0,跳出循环,7-3-6!=0,跳出循环
  4. 找到全为6的组合是否能组成7,此时从下标为2的数开始找,7-6-6!=0,跳出循环
  5. 找到全为7的组合是否能组成7,从下标为3的数开始找,7-7=0
  6. 结束,存储满足的组合

python代码

class Solution:
    def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
        size = len(candidates)
        if size == 0:
            return []
        candidates.sort()
        path = []
        res = []
        self.__dfs(candidates, 0, size, path, res, target)
        return res
    def __dfs(self,candidates, begin, end, path, res, target):
        if target == 0:
            res.append(path[:])
            return 
        for i in range(begin,end):
            residue = target - candidates[i]
            if residue < 0:
                return
            path.append(candidates[i])
            self.__dfs(candidates, i, end, path, res, residue)
            path.pop()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值