mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-11 04:54:51 +08:00
更新 回溯总结 排版格式修复
This commit is contained in:
@ -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;
|
||||

|
||||
|
||||
|
||||
### 组合总和(三)
|
||||
#### 组合总和(三)
|
||||
|
||||
在[回溯算法:求组合总和(三)](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;
|
||||

|
||||
|
||||
|
||||
# 子集问题
|
||||
## 子集问题
|
||||
|
||||
## 子集问题(一)
|
||||
### 子集问题(一)
|
||||
|
||||
在[回溯算法:求子集问题!](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()) { // 终止条件可以不加
|
||||
|
||||

|
||||
|
||||
## 递增子序列
|
||||
### 递增子序列
|
||||
|
||||
在[回溯算法:递增子序列](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>
|
||||
|
||||
|
Reference in New Issue
Block a user