-
回溯算法核心思想
- 递归构造:用一个递归函数 backtrack 来构造组合,每次递归选择一个数字加入到当前组合 path 中。
- 结束条件:当 path 的长度等于 k 时,将当前组合复制后加入结果集 res,然后结束当前递归分支。
- 回溯撤销:递归调用返回后,使用 path.pop() 撤销上一次选择,从而恢复到上一步的状态,准备尝试其他选择。
-
剪枝优化技巧
在 for 循环中,通过判断 len(path) + (n - i + 1) < k 来判断剩余的数字数量是否足够凑齐 k 个数。如果不足,则直接 break,避免无谓的递归调用,从而提高效率。
由于需要枚举所有的组合,在最坏情况下,组合数量会非常大,但通过剪枝可以在一定程度上减小实际递归调用的次数。 -
递归与状态保存:在递归过程中,path 用于保存当前构造的组合状态,使用 path.copy() 保证加入结果集的是当前状态的一个副本,避免后续修改影响已经保存的组合