216. 组合总和III
分析
采用深度优先搜索(DFS)+ 回溯来解决问题:
- 递归函数设计:
- 参数:
- 当前搜索起点
start
(避免重复选择数字) - 当前目标和
n
- 当前还需要选的数字个数
k
- 当前搜索起点
- 终止条件:
- 如果
n == 0
且k == 0
,说明找到了一组符合条件的组合,将其加入结果列表 - 如果
n != 0
且k == 0
,或者n < 0
,直接返回(剪枝)
- 如果
- 参数:
- 递归遍历:
- 从
start
开始,依次尝试数字i
(范围start
到9
- 每次选择
i
后递归:将i
加入路径,更新n = n - i
,更新k = k - 1
- 递归返回后撤销选择
i
(回溯)
- 从
- 剪枝优化:
- 如果
i > n
,则跳过剩余数字,直接剪枝,因为后续数字只会更大
- 如果
时间复杂度
- 最多有
9 / k
个组合,其中n / k = n! / k!(n-k)!
- 每次递归需要
O(k)
的时间来复制路径
总时间复杂度为 O(k * 9 / k)
空间复杂度
- 路径
path
的最大深度为k
,递归调用栈的深度也为k
空间复杂度为 O(k)
C++代码
|
|