1. 组合总和问题解析
组合总和(Combination Sum)是LeetCode上经典的回溯算法问题,编号39。题目要求给定一个无重复元素的整数数组candidates和一个目标整数target,找出candidates中所有可以使数字和为target的唯一组合。candidates中的数字可以无限制重复选取。
1.1 问题特点分析
这类问题有几个关键特征:
- 解集不能包含重复的组合
- 同一个数字可以被无限次使用
- 所有输入数字都是正整数(根据题目示例推断)
- 需要返回所有可能的解,而非最优解
这类问题的解法通常需要考虑:
- 如何避免生成重复组合
- 如何高效剪枝减少不必要的搜索
- 如何设计递归终止条件
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 算法设计与思路
2.1 回溯算法框架
回溯算法是解决这类组合问题的标准方法,其基本框架为:
- 排序输入数组(重要预处理)
- 定义递归函数,参数通常包括:
- 当前搜索起始位置
- 剩余目标值
- 当前路径(已选择的数字组合)
- 递归终止条件:
- 剩余目标值为0(找到有效解)
- 剩余目标值小于当前候选数(剪枝)
- 递归过程:
- 选择当前数字加入路径
- 递归调用自身(注意参数变化)
- 撤销选择(回溯)
2.2 关键设计决策
在本题的具体实现中,有几个关键设计点:
-
排序预处理:
go复制
sort.Ints(candidates)排序有两个重要作用:
- 便于后续剪枝(当剩余目标小于当前数字时可提前终止)
- 避免生成重复组合(通过控制搜索起始位置)
-
路径管理:
go复制path := []int{}使用切片来记录当前路径,注意在Go中切片是引用类型,需要特别注意深拷贝问题。
-
递归函数设计:
go复制var dfs func(start, res int)使用闭包形式定义递归函数,可以方便访问外部变量(path和ans)。
3. 代码实现详解
3.1 完整代码解析
让我们逐部分分析提供的Go实现:
go复制import
