更新 回溯总结 排版格式修复

This commit is contained in:
jinbudaily
2023-07-24 15:15:04 +08:00
parent 028bfdc662
commit 93cba02a12

View File

@ -8,7 +8,9 @@
> 20张树形结构图、14道精选回溯题目21篇回溯法精讲文章由浅入深一气呵成这是全网最强回溯算法总结
# 回溯法理论基础
# 回溯总结篇
## 回溯法理论基础
转眼间[「代码随想录」](https://img-blog.csdnimg.cn/20200815195519696.png)里已经分享连续讲解了21天的回溯算法是时候做一个大总结了本篇高能需要花费很大的精力来看
@ -51,10 +53,10 @@ void backtracking(参数) {
**事实证明这个模板会伴随整个回溯法系列!**
# 组合问题
## 组合问题
### 组合问题
在[回溯算法:求组合问题!](https://programmercarl.com/0077.组合.html)中,我们开始用回溯法解决第一道题目:组合问题。
我在文中开始的时候给大家列举k层for循环例子进而得出都是同样是暴力解法为什么要用回溯法
@ -82,9 +84,9 @@ void backtracking(参数) {
**在for循环上做剪枝操作是回溯法剪枝的常见套路** 后面的题目还会经常用到。
## 组合总和
### 组合总和
### 组合总和(一)
#### 组合总和(一)
在[回溯算法:求组合总和!](https://programmercarl.com/0216.组合总和III.html)中,相当于 [回溯算法:求组合问题!](https://programmercarl.com/0077.组合.html)加了一个元素总和的限制。
@ -99,7 +101,7 @@ void backtracking(参数) {
所以剪枝的代码可以在for循环加上 `i <= 9 - (k - path.size()) + 1` 的限制!
### 组合总和(二)
#### 组合总和(二)
在[回溯算法:求组合总和(二)](https://programmercarl.com/0039.组合总和.html)中讲解的组合总和问题,和[回溯算法:求组合问题!](https://programmercarl.com/0077.组合.html)[回溯算法:求组合总和!](https://programmercarl.com/0216.组合总和III.html)和区别是:本题没有数量要求,可以无限重复,但是有总和的限制,所以间接的也是有个数的限制。
@ -128,7 +130,7 @@ for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target;
![39.组合总和1](https://code-thinking-1253855093.file.myqcloud.com/pics/20201118202115929.png)
### 组合总和(三)
#### 组合总和(三)
在[回溯算法:求组合总和(三)](https://programmercarl.com/0040.组合总和II.html)中集合元素会有重复,但要求解集不能包含重复的组合。
@ -151,7 +153,7 @@ for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target;
对于去重,其实排列和子集问题也是一样的道理。
## 多个集合求组合
### 多个集合求组合
在[回溯算法:电话号码的字母组合](https://programmercarl.com/0017.电话号码的字母组合.html)中,开始用多个集合来求组合,还是熟悉的模板题目,但是有一些细节。
@ -167,7 +169,7 @@ for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target;
其实本题不算难,但也处处是细节,还是要反复琢磨。
# 切割问题
## 切割问题
在[回溯算法:分割回文串](https://programmercarl.com/0131.分割回文串.html)中,我们开始讲解切割问题,虽然最后代码看起来好像是一道模板题,但是从分析到学会套用这个模板,是比较难的。
@ -192,9 +194,9 @@ for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target;
![131.分割回文串](https://code-thinking-1253855093.file.myqcloud.com/pics/20201118202448642.png)
# 子集问题
## 子集问题
## 子集问题(一)
### 子集问题(一)
在[回溯算法:求子集问题!](https://programmercarl.com/0078.子集.html)中讲解了子集问题,**在树形结构中子集问题是要收集所有节点的结果,而组合问题是收集叶子节点的结果**。
@ -219,7 +221,7 @@ if (startIndex >= nums.size()) { // 终止条件可以不加
}
```
## 子集问题(二)
### 子集问题(二)
在[回溯算法:求子集问题(二)](https://programmercarl.com/0090.子集II.html)中,开始针对子集问题进行去重。
@ -229,7 +231,7 @@ if (startIndex >= nums.size()) { // 终止条件可以不加
![90.子集II](https://code-thinking-1253855093.file.myqcloud.com/pics/2020111217110449.png)
## 递增子序列
### 递增子序列
在[回溯算法:递增子序列](https://programmercarl.com/0491.递增子序列.html)中,处处都能看到子集的身影,但处处是陷阱,值得好好琢磨琢磨!
@ -247,9 +249,9 @@ if (startIndex >= nums.size()) { // 终止条件可以不加
**相信这个图胜过千言万语的解释了**
# 排列问题
## 排列问题
## 排列问题(一)
### 排列问题(一)
[回溯算法:排列问题!](https://programmercarl.com/0046.全排列.html) 又不一样了。
@ -266,7 +268,7 @@ if (startIndex >= nums.size()) { // 终止条件可以不加
* 每层都是从0开始搜索而不是startIndex
* 需要used数组记录path里都放了哪些元素了
## 排列问题(二)
### 排列问题(二)
排列问题也要去重了,在[回溯算法:排列问题(二)](https://programmercarl.com/0047.全排列II.html)中又一次强调了“树层去重”和“树枝去重”。
@ -290,7 +292,7 @@ if (startIndex >= nums.size()) { // 终止条件可以不加
本题used数组即是记录path里都放了哪些元素同时也用来去重一举两得。
# 去重问题
## 去重问题
以上我都是统一使用used数组来去重的其实使用set也可以用来去重
@ -310,7 +312,7 @@ if (startIndex >= nums.size()) { // 终止条件可以不加
used数组可是全局变量每层与每层之间公用一个used数组所以空间复杂度是O(n + n)最终空间复杂度还是O(n)。
# 重新安排行程(图论额外拓展)
## 重新安排行程(图论额外拓展)
之前说过,有递归的地方就有回溯,深度优先搜索也是用递归来实现的,所以往往伴随着回溯。
@ -327,9 +329,9 @@ used数组可是全局变量每层与每层之间公用一个used数组
本题其实是一道深度优先搜索的题目,但是我完全使用回溯法的思路来讲解这道题题目,**算是给大家拓展一下思维方式,其实深搜和回溯也是分不开的,毕竟最终都是用递归**。
# 棋盘问题
## 棋盘问题
## N皇后问题
### N皇后问题
在[回溯算法N皇后问题](https://programmercarl.com/0051.N皇后.html)中终于迎来了传说中的N皇后。
@ -349,7 +351,7 @@ used数组可是全局变量每层与每层之间公用一个used数组
## 解数独问题
### 解数独问题
在[回溯算法:解数独](https://programmercarl.com/0037.解数独.html)中要征服回溯法的最后一道山峰。
@ -373,7 +375,7 @@ used数组可是全局变量每层与每层之间公用一个used数组
**这样,解数独这么难的问题也被我们攻克了**
# 性能分析
## 性能分析
**关于回溯算法的复杂度分析在网上的资料鱼龙混杂,一些所谓的经典面试书籍不讲回溯算法,算法书籍对这块也避而不谈,感觉就像是算法里模糊的边界**
@ -410,7 +412,7 @@ N皇后问题分析
**一般说道回溯算法的复杂度,都说是指数级别的时间复杂度,这也算是一个概括吧!**
# 总结
## 总结
**[「代码随想录」](https://img-blog.csdnimg.cn/20200815195519696.png)历时21天14道经典题目分析20张树形图21篇回溯法精讲文章从组合到切割从子集到排列从棋盘问题到最后的复杂度分析**,至此收尾了。
@ -449,3 +451,4 @@ N皇后问题分析
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
</a>