1. LeetCode 39. 组合总和解析与优化
1.1 问题理解与基础解法
组合总和问题要求我们找出所有能使数字和为目标值的唯一组合。给定一个无重复元素的整数数组 candidates 和一个目标整数 target,其中同一个数字可以被无限次选取。
基础解法采用回溯算法框架:
- 排序数组(关键优化前提)
- 递归尝试选取每个候选数
- 当剩余目标值为0时记录有效组合
- 当候选数大于剩余值时提前终止(剪枝)
注意:虽然题目允许重复使用相同元素,但要求解的组合本身不能重复(如[2,2,3]和[2,3,2]视为相同)
1.2 关键优化技巧
1.2.1 排序剪枝
将candidates排序后,当遇到第一个大于剩余target的数字时,可以直接终止当前层循环。因为后续数字只会更大,不可能满足条件。这是将时间复杂度从O(n^d)降低到实际可行范围的关键。
python复制candidates.sort() # 预处理排序
for i in range(start, len(candidates)):
if candidates[i] > remaining:
break # 提前终止无效分支
1.2.2 索引控制
通过传递start参数,确保:
- 允许重复使用同一元素(递归时传i)
- 避免生成顺序不同但元素相同的组合
- 自然实现组合的元素非递减排列
1.3 复杂度分析
- 时间复杂度:O(N^(T/M+1)),其中N是candidates数量,T是target,M是最小候选数
- 空间复杂度:O(T/M)(递归栈深度)
实测案例:
输入:candidates = [2,3,6,7], target = 7
排序后:[2,3,6,7]
执行路径:
- 选2(剩余5)→选2(剩余3)→选2(剩余1)→选2(无效)
- 回退选3→得到[2,2,3]
- 继续尝试选7→直接得到[7]
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. LeetCode 40. 组合总和II深度剖析
2.1 与39题的核心差异
本题两个关键变化:
- candidates可能包含重复数字
- 每个数字在每个组合中只能使用一次
这导致需要解决两个新问题:
- 如何避免使用同一位置的数字多
