This commit is contained in:
youngyangyang04
2021-04-16 11:09:29 +08:00
parent a8c13e604b
commit 17100f571b

View File

@ -1,6 +1,3 @@
<p align='center'>
<img src="https://img-blog.csdnimg.cn/20201215214102642.png" width=400 >
</p>
<p align="center">
<a href="https://github.com/youngyangyang04/leetcode-master"><img src="https://img.shields.io/badge/Github-leetcode--master-lightgrey" alt=""></a>
<a href="https://img-blog.csdnimg.cn/20201115103410182.png"><img src="https://img.shields.io/badge/刷题-微信群-green" alt=""></a>
@ -11,11 +8,9 @@
</p>
> 今天开始正式回溯法的讲解,老规矩,先概述
# 什么是回溯法
# 什么是回溯法
回溯法也可以叫做回溯搜索法,它是一种搜索的方式。
回溯法也可以叫做回溯搜索法,它是一种搜索的方式。
在二叉树系列中,我们已经不止一次,提到了回溯,例如[二叉树:以为使用了递归,其实还隐藏着回溯](https://mp.weixin.qq.com/s/ivLkHzWdhjQQD1rQWe6zWA)。
@ -29,13 +24,13 @@
**因为回溯的本质是穷举,穷举所有可能,然后选出我们想要的答案**,如果想让回溯法高效一些,可以加一些剪枝的操作,但也改不了回溯法就是穷举的本质。
那么既然回溯法并不高效为什么还要用它呢?
那么既然回溯法并不高效为什么还要用它呢?
因为没得选,一些问题能暴力搜出来就不错了,撑死了再剪枝一下,还没有更高效的解法。
此时大家应该好奇了,都什么问题,这么牛逼,只能暴力搜索。
# 回溯法解决的问题
# 回溯法解决的问题
回溯法,一般可以解决如下几种问题:
@ -67,17 +62,17 @@
这块可能初学者还不太理解,后面的回溯算法解决的所有题目中,我都会强调这一点并画图举相应的例子,现在有一个印象就行。
# 回溯法模板
# 回溯法模板
这里给出Carl总结的回溯算法模板。
在讲[二叉树的递归](https://mp.weixin.qq.com/s/PwVIfxDlT3kRgMASWAMGhA)中我们说了递归三部曲,这里我再给大家列出回溯三部曲。
* 回溯函数模板返回值以及参数
* 回溯函数模板返回值以及参数
在回溯算法中我的习惯是函数起名字为backtracking这个起名大家随意。
回溯算法中函数返回值一般为void。
回溯算法中函数返回值一般为void。
再来看一下参数,因为回溯算法需要的参数可不像二叉树递归的时候那么容易一次性确定下来,所以一般是先写逻辑,然后需要什么参数,就填什么参数。
@ -86,10 +81,10 @@
回溯函数伪代码如下:
```
void backtracking(参数)
void backtracking(参数)
```
* 回溯函数终止条件
* 回溯函数终止条件
既然是树形结构,那么我们在讲解[二叉树的递归](https://mp.weixin.qq.com/s/PwVIfxDlT3kRgMASWAMGhA)的时候,就知道遍历树形结构一定要有终止条件。
@ -105,13 +100,13 @@ if (终止条件) {
}
```
* 回溯搜索的遍历过程
* 回溯搜索的遍历过程
在上面我们提到了,回溯法一般是在集合中递归搜索,集合的大小构成了树的宽度,递归的深度构成的树的深度。
如图:
如图:
<img src='../pics/回溯算法理论基础.png' width=600> </img></div>
![回溯算法理论基础](https://img-blog.csdnimg.cn/20210130173631174.png)
注意图中,我特意举例集合大小和孩子的数量是相等的!
@ -149,7 +144,7 @@ void backtracking(参数) {
```
**这份模板很重要,后面做回溯法的题目都靠它了!**
**这份模板很重要,后面做回溯法的题目都靠它了!**
如果从来没有学过回溯算法的录友们,看到这里会有点懵,后面开始讲解具体题目的时候就会好一些了,已经做过回溯法题目的录友,看到这里应该会感同身受了。
@ -165,8 +160,14 @@ void backtracking(参数) {
今天是回溯算法的第一天按照惯例Carl都是先概述一波然后在开始讲解具体题目没有接触过回溯法的同学刚学起来有点看不懂很正常后面和具体题目结合起来会好一些。
---------------------------
* 公众号:[代码随想录](https://img-blog.csdnimg.cn/20201210231711160.png)
* B站[代码随想录](https://space.bilibili.com/525438321)
* Github[leetcode-master](https://github.com/youngyangyang04/leetcode-master)
* 知乎:[代码随想录](https://www.zhihu.com/people/sun-xiu-yang-64)
![](https://img-blog.csdnimg.cn/20210416110157800.png)
> **我是[程序员Carl](https://github.com/youngyangyang04),可以找我[组队刷题](https://img-blog.csdnimg.cn/20201115103410182.png),也可以在[B站上找到我](https://space.bilibili.com/525438321),本文[leetcode刷题攻略](https://github.com/youngyangyang04/leetcode-master)已收录,更多[精彩算法文章](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzUxNjY5NTYxNA==&action=getalbum&album_id=1485825793120387074&scene=173#wechat_redirect)尽在公众号:[代码随想录](https://img-blog.csdnimg.cn/20200815195519696.png),关注后就会发现和「代码随想录」相见恨晚!**
**如果感觉对你有帮助,不要吝啬给一个👍吧!**