提示
一、回溯总结
回溯一种暴力穷举法,效率不高,但是对于一些无限套for可能无法解决的问题能够轻易化解
for循环横向遍历,递归纵向遍历,回溯不断调整结果集,从而遍历每一种可能
- 组合问题
- 在N个数中按照规则找出K个数的集合,收集的是叶子节点
- 分为有重复元素和无重复元素,有重复元素需要排序去重,used数组或set
- 终止条件通常为满足集合的条件
- 剪枝的精髓在于for循环在寻找起点的时候要有一个范围,如果这个起点到集合终止之间的元素已经不够题目要求的k个元素了,就没有必要搜索了。
- 排列问题
- 全排列,N个数有多少种排列可能,收集叶子节点
- 每层都是从0开始遍历,同时需要使用used数组记录使用过的元素,不能重复使用
- 数组中有重复元素时,不仅要used数组去重,同时需要确保在下次递归时元素不会重复使用
- 切割问题
- 切割问题类似于组合问题,用求解组合问题的思路求解切割问题
- 在一个数组中切割,需要使用到startIndex,所以切割范围为[startIndex,i],截取子串判断是否符合条件
- 子集问题
- N个数组成的数组有多少个子集,收集的是全部节点
- 在终止条件之前,就要收集到结果集中,终止条件可以不加,for循环是由范围的
- 数组中有重复元素是,需要排序去重,使用used数组
二、day1复习
有些生疏,问题不大
总结
对回溯有了一定得了解,还不是特别牢固,还得需要及时复习
学习时间90min。
学习资料:《代码随想录》。