回溯算法是算法设计中的一种方法。回溯算法是一种渐进式寻找并构建问题解决方式的策略。回溯算法会先从一个可能的动作开始解决问题,如果不行,就回溯并选择另一个动作,直到将问题解决。

就像你在一个迷宫里面遇到了当前有三条岔路,你选择了第一条后发现此路不通,那你是不是要回到原点,进行选择第二条道路,以此类推,最后选择一条正确的道路。

什么问题适合用回溯算法解决?

  • 有很多分岔路
  • 这些路里面有死路,也有出路
  • 通常需要用递归来模拟所有的路

场景一

全排列

  1. // 输入
  2. const input = [1, 2, 3];
  3. // 输出
  4. const output = [
  5. [1, 2, 3],
  6. [1, 3, 2],
  7. [2, 1, 3],
  8. [2, 3, 1],
  9. [3, 1, 2],
  10. [3, 2, 1],
  11. ];

步骤:

  1. 用递归模拟所有出路的情况
  2. 遇到包含重复元素的情况,就回溯
  3. 收集所有到达递归终点的情况并返回