第一块:
1、组合问题:for循环中,因为组合不能重复的缘故,需要在每次递归的时候控制for循环的次数
2、组合问题2:有重复值的。
先排序,树层不能重复用、树枝可以重复用
第二块:多个集合求组合
1、电话号码的字符组合
水平方向上不再剪枝
第三块:切割问题
横向for遍历结尾点,纵向递归再回溯改变串的头
第四块:子集问题
子集问题收集所有节点的结果,组合问题只收集叶子节点(中间过程不收集)的结果
1、子集问题
2、子集问题(2):给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
本题需要去重:先对数组进行排序。横向for循环遍历时需要去重,树枝不需要去重。
第五块:递增子序列
不能重新排序,又不能出现重复。应选取某种数据结构,记录树层上已经出现过元素的值。
递增子序列,树层上不能回头,递归之下,满足集合size>1,收集结果集
第六块:排列问题
1、全排列:给定一个 没有重复 数字的序列,返回其所有可能的全排列。
没有剪枝,不同位置代表的含义不同,树层上无需剪枝,遍历所有即可。
2、全排列2:给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。
去重之前需要对元素进行排列,以免漏掉后面相同的元素。树层上进行剪枝,利用映射标记已经用过的元素,防止结果集出现重复
第七块:N皇后问题:
出于对剪枝的考虑,从上到下一行一行的放皇后,只需要判断前面的行中是否有不满足的、
皇后数量=层数,N皇后,每一个皇后可走的位置是for循环。
第八块:解决数独问题
递归函数中for循环嵌套两层
计算好每个位置属于哪个小方块就方便许多了