回溯算法总结

330 阅读1分钟

大概花了半个月学习卡尔老师代码随想录中回溯章节,里面的讲解通俗易懂,配合各种类型的题目,使我对回溯算法有了一个全面的理解,下面就对学习回溯算法做一个总结。

什么是回溯算法

回溯法也可以叫做回溯搜索法,它是一种搜索的方式。回溯函数是一种递归函数,如果没有回溯算法,我们可能就要用很多层for循环去遍历,回溯算法可以理解是用递归帮我们去调用for循环,使我们的代码更加简洁明了。

回溯算法题目分类

回溯题目分类.png

回溯三部曲

public List<List<类型>> result;
public List<类型> path;
返回参数 function(入参){
    backtracking(入参);
    return result;
}
void backtracking(参数) {
    if (满足终止条件) {
        result.add(path);
        return;
    }
    for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
        处理节点;
        backtracking(路径,选择列表); // 递归
        回溯,撤销处理结果
    }
}

注意:

  • 大部分问题都有startIndex(避免元素重复选择,比如组合、子集等问题)
  • 去重问题(一般使用树层去重,去重问题在遍历之前一般要求数组是有序的,所以要进行排序)
  • 剪枝

回溯算法解题步骤

  • 1、画出树形图(超级重要),搞清楚结果集是在叶子结点还是树枝结点收集
  • 2、明确回溯三步曲中的终止条件(递归的出口)
  • 3、细节问题,比如有效ip地址、n皇后、解数独,递增子序列等这些题目一般都要写isValid判定函数