BackTracking
回溯
常常搭配剪枝来提速
回溯的时间复杂度通常是指数级别的
应用范围
- 组合和排列
- 切割
- 子集
- 棋盘
- 路线
组合、排列和集合
代码不同体现在
startIndex、去重方式、获取结果等方面.
注意树层和树枝剪枝的区别
组合
77. 组合最入门的39. 组合总和可复用,注意去重216. 组合总和 III40. 组合总和 II数组元素不唯一且不可复用,注意排序\used数组剪枝。17. 电话号码的字母组合
排列
排列需要用到used数组,否则没法区分是否使用。
集合
序列
491. 递增子序列因为保证序列的顺序,不能排序。通过set来记录每层用过的元素。
总结:
排列问题需要从
0开始,组合从start开始。组合问题, 如果含重复元素, 要先排序, 后去重, 方法如下.
i > 0 && nums[i] == nums[i - 1] && !used[i - 1]i > startIndex && nums[i] == nums[i - 1](推荐, 无需used数组)
排列问题同理, 但是
used数组必不可少,否则没法记录是否使用。组合排列问题在叶子节点处收集结果, 子集收集所有路径.
分割
其他(较难)
BackTracking
https://messenger1th.github.io/2024/07/24/LeetCode/BackTracking/