组合问题
- 单个集合的组合问题,其for循环的初值为startIndex;而多个集合的组合问题,其for循环的初值为0。(单个集合:力扣77:组合、力扣216:组合总和III;多个集合:力扣17:电话号码的字母组合)
- 集合元素是否可以重复使用,代码实现的区别在于递归函数的startIndex是否从当前元素的下一位置开始;(力扣39:组合总和)
- 集合中包含重复元素的组合问题,可以通过对集合排序后只对重复元素的第一个位置进行递归操作来解决。(力扣40:组合总和II)
切割问题
切割问题与组合问题的区别在于:组合问题是对集合的元素进行选取,而切割问题是对集合的区间进行划分。因此如何表示切割的区间是切割问题的很重要的一步。
例如在力扣131:分割回文串中,for循环中startIndex和i为切割区间。
排列问题
排列问题不同于组合问题,需要考虑不同元素间的顺序问题,因此每次遍历需要从0开始;但是与多个集合的组合问题不同,排列问题不能理解为单个集合的多次组合,因为其元素间存在互斥关系,已经使用过的元素不能在下次递归中出现,因此应当对使用过的元素进行标记。
排列问题的去重(力扣47:全排列II)相较于组合会有些复杂,可以使用代码随想录的方法,也可以将集合排序后每次移动到最后一个为使用元素。
子集问题
子集问题是在树搜索过程中的所有结点都收集结果,而其他问题只是在叶子结点收集结果。