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++代码
|
|