代码随想录刷题| 回溯算法的总结

简介: 代码随想录刷题| 回溯算法的总结

回溯算法的心得


   回溯算法的本质是穷举,是利用递归进行穷举,一般来首,我们常见的穷举方式就是for循环遍历,是遍历访问每一个值。但是这种情况应该是你知道可以套几层循环的情况。


       而使用回溯算法是:你都不知道要循环多少层,都不知道在哪里终止,需要循环的条件一变化就没办法,此时那就是回溯算法最管用了


       回溯算法是递归的副产物,有递归肯定需要回溯


       利用回溯算法可以解答的题目都是可以抽象成树形结构(N叉树)。因为回溯法解决的都是在集合中递归查找子集,集合的大小就构成了树的宽度,递归的深度,都构成的树的深度


       回溯算法的模板:

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


回溯算法适合的问题

组合问题


77.组合

给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。你可以按 任何顺序 返回答案

一个元素不重复的集合,组合,元素不可以被重复选取

每递归一层,集合中的下标向后移动一位,防止出现相同结果

216.组合总和|||

与77.组合相似,只不过是将得到的组合中的数相加起来了

一个元素不重复的集合,组合相加,元素不可以被重复选取

每递归一层,集合中的下标向后移动一位,防止出现相同结果

难点:剪枝操作:至多可以遍历到什么位置上 9 - (k - nums.size()) + 1

17.电话号码的字母组合

多个集合(元素不重复)的组合

难点:对数字和字母的关系映射

39.组合总和

一个元素不重复的集合,组合相加,元素可以被重复选取

因为元素可以被重复选取,每递归一层,集合中的下标不用移动

难点:剪枝操作:需要先对数组中的元素进行排序,然后如果 sum + candidates[i] > target 就终止遍历

40.组合总和||

一个元素有重复的集合,组合相加,元素可以被重复选取

因为元素可以被重复选取,每递归一层,集合中的下标不用移动,但是需要去重

难点:去重操作

只有排序之后才可以进行剪枝操作和去重操作

剪枝操作和39.组合总数相同

去重操作需要使用used[]数组进行树层去重操作


切割问题


131.分割回文串

需要的前置知识:判断字符串是否是回文串

一个元素有重复的字符串,从第一个元素开始往后,每层添加一位进行分割

因为字符串要被不断分割,每递归一层,字符串的下标向后移动一位

难点:递归分割字符串

先判断是否满足回文串

再进行递归回溯

93.复原IP地址

很多公司面试的题目

需要的前置知识:判断截取数字的合法性

与分割回文串相似,都是分割完成之后进行判断

使用pointNum记录所添加的逗点,在满足三个逗点之后,在收集结果前判断最后一个都逗点后面的数字是否合法

难点:递归/回溯字符串

先判断是否合法

添加逗点,逗点数增加

递归的时候注意下标的移动是+2

回溯的时候回复字符串和逗点数减少


子集问题


78.子集

收集树形结构的所有节点

一个无重复元素的集合,元素不可以被重复选取

每递归一层,集合中的下标向后移动一位,防止出现相同结果

比较简单

90.子集||

收集树形结构的所有节点

一个有重复元素的集合,元素不可以被重复选取

因为有相同的元素,会造成重复情况,所以需要进行去重

难点:去重操作

使用used数组进行树层去重


排序问题


46.全排列

树枝去重

一个无重复元素的集合,只需要考虑树枝去重就可以

可以直接使用path容器去重

可以使用used[]数组进行去重

47.全排列||

树枝去重+树层去重

一个有重复元素的集合,需要考虑树枝去重和树层去重

使用used[]数组进行去重

难点:used[]数组对树层和树枝不同的去重操作


棋盘问题


51.N皇后

二维数组表示棋盘

需要的前置知识:判断棋盘上位置的合法性

难点:对棋盘的抽象

37.解数独

二维数组表示棋盘

需要的前置知识:判断棋盘上数字的合法性

不仅需要遍历棋盘的每一格,还需要遍历每一格上的不同数字

难点:二维递归


其他问题


491.递增子序列(和子集问题比较像)

不能排序,排序会打乱集合中的递增顺序

使用set去重,因为set是不可重复的

set不回溯,收集的是当前层的所有出现过的元素

332.重新安排行程

难点:行程的映射

难点:数据结构的选取

难点:终止条件

相关文章
|
4天前
|
机器学习/深度学习 存储 算法
近端策略优化(PPO)算法的理论基础与PyTorch代码详解
近端策略优化(PPO)是深度强化学习中高效的策略优化方法,广泛应用于大语言模型的RLHF训练。PPO通过引入策略更新约束机制,平衡了更新幅度,提升了训练稳定性。其核心思想是在优势演员-评论家方法的基础上,采用裁剪和非裁剪项组成的替代目标函数,限制策略比率在[1-ϵ, 1+ϵ]区间内,防止过大的策略更新。本文详细探讨了PPO的基本原理、损失函数设计及PyTorch实现流程,提供了完整的代码示例。
106 10
近端策略优化(PPO)算法的理论基础与PyTorch代码详解
|
2月前
|
存储 算法 程序员
C 语言递归算法:以简洁代码驾驭复杂逻辑
C语言递归算法简介:通过简洁的代码实现复杂的逻辑处理,递归函数自我调用解决分层问题,高效而优雅。适用于树形结构遍历、数学计算等领域。
|
3月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
99 1
|
3月前
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
数据结构与算法系列学习之串的定义和基本操作、串的储存结构、基本操作的实现、朴素模式匹配算法、KMP算法等代码举例及图解说明;【含常见的报错问题及其对应的解决方法】你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
|
3月前
|
存储 缓存 算法
通过优化算法和代码结构来提升易语言程序的执行效率
通过优化算法和代码结构来提升易语言程序的执行效率
|
3月前
|
算法
分享一些提高二叉树遍历算法效率的代码示例
这只是简单的示例代码,实际应用中可能还需要根据具体需求进行更多的优化和处理。你可以根据自己的需求对代码进行修改和扩展。
|
3月前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习(8)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
3月前
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习之顺序表【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
顺序表的定义和基本操作之插入;删除;按值查找;按位查找等具体详解步骤以及举例说明
|
3月前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
3月前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之单双链表精题详解(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!