1. 问题背景与核心挑战
组合总和问题是LeetCode上经典的算法题型之一,要求找出所有能使数字和为目标数的唯一组合。这类问题在金融投资组合优化、资源分配、生产计划等实际场景中都有广泛应用。以题目[39. 组合总和]为例,给定一个无重复元素的整数数组candidates和一个目标数target,需要找出所有candidates中可以使数字和为target的唯一组合。
这个问题的难点在于:
- 需要处理重复使用同一元素的特殊情况
- 必须避免结果集中出现排列不同但元素相同的重复组合
- 当候选数组较大时,暴力枚举会面临指数级的时间复杂度
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 回溯算法框架解析
2.1 基本回溯模板
回溯算法的核心框架可以抽象为以下伪代码:
java复制void backtrack(路径, 选择列表) {
if (满足结束条件) {
结果集.add(路径);
return;
}
for (选择 : 选择列表) {
做选择;
backtrack(路径, 选择列表);
撤销选择;
}
}
对于组合总和问题,我们需要做以下具体化:
- 路径:当前已经选择的数字组合
- 选择列表:从候选数组中可选的数字(需要考虑可重复选取)
- 结束条件:当前组合的和等于target
2.2 Java实现基础版本
java复制class Solution {
List<List<Integer>> res = new ArrayList<>();
public List<List<Integer>> combinationSum(int[] candidates, int target) {
backtrack(candidates, target, 0, new ArrayList<>(), 0);
return res;
}
private void backtrack(int[] candidates, int target, int start, List<Integer> path, int sum) {
if (su
