BackTracking

回溯

常常搭配剪枝来提速

回溯的时间复杂度通常是指数级别的

应用范围

  • 组合和排列
  • 切割
  • 子集
  • 棋盘
  • 路线

组合、排列和集合

代码不同体现在startIndex、去重方式、获取结果等方面.

注意树层和树枝剪枝的区别

组合

排列

排列需要用到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/
作者
Epoch
发布于
2024年7月24日
许可协议