代码随想录算法训练营(回溯总结篇)

回溯也可以说是暴力搜索(最多剪枝一下)。回溯是递归的副产品,只要有递归就会有回溯。

一.分类

1.组合问题

(1)按组合元素的个数
  • 代码随想录算法训练营(回溯总结篇)_第1张图片
 (2)按组合元素的总和
  • 有重复元素

代码随想录算法训练营(回溯总结篇)_第2张图片

 

  • 同一元素可以重复选(有重复元素的情况下)

代码随想录算法训练营(回溯总结篇)_第3张图片

 (3)复杂问题(升序或降序组合等)

  • 先根据思路画出树形图,然后再进行条件约束

2.排列问题

(1)全排列

代码随想录算法训练营(回溯总结篇)_第4张图片

 (2)复杂问题
  • 有重复元素,需要进行树形剪枝

3.切割问题

(1)切割回文串

4.子集问题

5.棋盘问题

一维

二维

二.模板

void backtracking(参数) {
    if (终止条件) {
        存放结果;
        return;
    }

    for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
        处理节点;
        backtracking(路径,选择列表); // 递归
        回溯,撤销处理结果
    }
}

你可能感兴趣的:(算法,leetcode,数据结构)