| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 回溯算法。力扣:77.组合 -> 正文阅读 |
|
[数据结构与算法]回溯算法。力扣:77.组合 |
原文于代码随想录 回溯函数模板返回值以及参数 回溯算法中函数返回值一般为void。 再来看一下参数,因为回溯算法需要的参数可不像二叉树递归的时候那么容易一次性确定下来,所以一般是先写逻辑,然后需要什么参数,就填什么参数。
回溯函数终止条件
注意图中,我特意举例集合大小和孩子的数量是相等的! 回溯函数遍历过程伪代码如下:
for 循环就是遍历集合区间,可以理解一个节点有多少个孩子,这个for循环就执行多少次。 backtracking这里自己调用自己,实现递归。 大家可以从图中看出for循环可以理解是横向遍历,backtracking(递归)就是纵向遍历,这样就把这棵树全遍历完了,一般来说,搜索叶子节点就是找的其中一个结果了。 分析完过程,回溯算法模板框架如下:
力扣:77.组合 三部曲 那么如何在这个树上遍历,然后收集到我们要的结果集呢? 图中每次搜索到了叶子节点,我们就找到了一个结果。 相当于只需要把达到叶子节点的结果收集起来,就可以求得 n个数中k个数的组合集合。 在这里要定义两个全局变量,一个用来存放符合条件单一结果,一个用来存放符合条件结果的集合。 代码如下:
然后还需要一个参数,为int型变量startIndex,这个参数用来记录本层递归的中,集合从哪里开始遍历(集合就是[1,…,n] )。 2、回溯函数终止条件: path这个数组的大小如果达到k,说明我们找到了一个子集大小为k的组合了,在图中path存的就是根节点到叶子节点的路径。 所以终止条件代码如下:
3、单层搜索的过程: 代码如下:
backtracking的下面部分就是回溯的操作了,撤销本次处理的结果。
递归函数名字:从【startindex,n】中挑出k-path.size()个数塞进path中,然后将此path塞进result中。 总得来说代码类似于模板:
二:剪枝优化 所以,可以剪枝的地方就在递归中每一层的for循环所选择的起始位置。 1:已经选择的元素个数:path.size();
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 9:27:39- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |