Skip to content

Commit 848a3cb

Browse files
author
ningfeng
committed
算法基础锚点添加 +
1 parent 23f7f3e commit 848a3cb

File tree

5 files changed

+170
-82
lines changed

5 files changed

+170
-82
lines changed

docs/08.md

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,16 @@
1-
# 1 二叉树的递归套路
1+
2+
- [1 二叉树的递归套路](#1)
3+
* [1.1 二叉树的递归套路深度实践](#11)
4+
+ [1.1.1 例一:判断二叉树平衡与否](#111)
5+
+ [1.1.2 例二:返回二叉树任意两个节点最大值](#112)
6+
+ [1.1.3 例三:返回二叉树中的最大二叉搜索树Size](#113)
7+
+ [1.1.4 例四:派对最大快乐值](#114)
8+
+ [1.1.5 例五:判断二叉树是否是满二叉树](#115)
9+
+ [1.1.6 例六:二叉搜索树的头结点](#116)
10+
+ [1.1.7 例子七:是否是完全二叉树](#117)
11+
+ [1.1.8 例子八:最低公共祖先](#118)
12+
13+
<h1 id='1'>1 二叉树的递归套路</h1>
214

315
1、 可以解决面试中的绝大部分二叉树(95%以上)的问题,尤其是树形dp问题
416

@@ -14,9 +26,9 @@
1426
5. 递归函数都返回S,每颗子树都这么要求
1527
6. 写代码,在代码中考虑如何把左树信息和右树信息整合出整棵树的信息
1628

17-
## 1.1 二叉树的递归套路深度实践
29+
<h2 id='11'>1.1 二叉树的递归套路深度实践</h2>
1830

19-
### 1.1.1 例一:判断二叉树平衡与否
31+
<h3 id='111'>1.1.1 例一:判断二叉树平衡与否</h3>
2032

2133
给定一棵二叉树的头结点head,返回这颗二叉树是不是平衡二叉树
2234

@@ -134,7 +146,7 @@ public class Code01_IsBalanced {
134146

135147
```
136148

137-
### .1.2 例二:返回二叉树任意两个节点最大值
149+
<h2 id='112'>1.1.2 例二:返回二叉树任意两个节点最大值</h2>
138150

139151
给定一棵二叉树的头结点head,任何两个节点之间都存在距离,返回整棵二叉树的最大距离
140152

@@ -307,7 +319,7 @@ public class Code08_MaxDistance {
307319
}
308320
```
309321

310-
### 1.1.3 例三:返回二叉树中的最大二叉搜索树Size
322+
<h3 id='113'>1.1.3 例三:返回二叉树中的最大二叉搜索树Size</h3>
311323

312324
给定一颗二叉树的头结点head,返回这颗二叉树中最大的二叉搜索树的Size
313325

@@ -522,7 +534,7 @@ public class Code04_MaxSubBSTSize {
522534
}
523535
```
524536

525-
### 1.1.4 例四:派对最大快乐值
537+
<h3 id='114'>1.1.4 例四:派对最大快乐值</h3>
526538

527539
排队最大快乐值问题,员工信息定义如下,多叉树结构:
528540

@@ -682,7 +694,7 @@ public class Code09_MaxHappy {
682694

683695
```
684696

685-
### 1.1.5 例五:判断二叉树是否是满二叉树
697+
<h3 id='115'>1.1.5 例五:判断二叉树是否是满二叉树</h3>
686698

687699
给定一棵二叉树的头结点head,返回这颗二叉树是不是满二叉树。
688700

@@ -793,7 +805,7 @@ public class Code02_IsFull {
793805

794806
```
795807

796-
### 1.1.6 例六:二叉搜索树的头结点
808+
<h3 id='116'>1.1.6 例六:二叉搜索树的头结点</h3>
797809

798810
给定一棵二叉树的头结点head,返回这颗二叉树中最大的二叉搜索子树的头节点
799811

@@ -937,8 +949,7 @@ public class Code05_MaxSubBSTHead {
937949

938950
}
939951
```
940-
941-
### 1.1.7 例子七:是否是完全二叉树
952+
<h3 id='117'>1.1.7 例子七:是否是完全二叉树</h3>
942953

943954
给定一棵二叉树的头结点head,返回这颗二叉树是不是完全二叉树
944955

@@ -1124,7 +1135,7 @@ public class Code06_IsCBT {
11241135

11251136
```
11261137

1127-
### 1.1.8 例子八:最低公共祖先
1138+
<h3 id='118'>1.1.8 例子八:最低公共祖先</h3>
11281139

11291140
给次那个一颗二叉树的头结点head,和另外两个节点a和b。返回a和b的最低公共祖先
11301141

docs/09.md

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,20 @@
1-
# 1 贪心算法
21

3-
## 1.1 基本概念
2+
- [1 贪心算法](#1)
3+
* [1.1 基本概念](#11)
4+
+ [1.2.1 贪心算法解释](#121)
5+
+ [1.2.2 贪心算法的证明问题](#122)
6+
* [1.2 贪心算法求解思路](#12)
7+
+ [1.2.1 标准求解过程](#121)
8+
+ [1.2.2 贪心算法解题套路](#122)
9+
* [1.3 贪心算法套路解题实战](#13)
10+
+ [1.3.1 例一:会议日程安排问题](#131)
11+
+ [1.3.2 例二:居民楼路灯问题](#132)
12+
+ [1.3.3 例三:哈夫曼树问题](#133)
13+
+ [1.3.4 例四:项目花费和利润问题](#134)
14+
15+
<h1 id='1'>1 贪心算法</h1>
16+
17+
<h2 id='11'>1.1 基本概念</h2>
418

519
1、最自然智慧的算法
620

@@ -10,15 +24,15 @@
1024

1125
4、对于贪心算法的学习主要是以增加阅历和经验为主
1226

13-
### 1.2.1 贪心算法解释
27+
<h3 id='121'>1.2.1 贪心算法解释</h3>
1428

1529
正例:通过一个例子来解释,假设一个数组中N个正数,第一个挑选出来的数乘以1,第二个挑选出来的数乘以2,同理,第N次挑选出来的数乘以N,总的加起来是我们的分数。怎么挑选数字使我们达到最大分数?
1630

1731
> 数组按从小到大的顺序排序,我们按顺序依次挑选,最终结果就是最大的。本质思想是因子随着挑选次数的增加会增大,我们尽量让大数去结合大的因子。
1832
1933
==贪心算法有时是无效的,后面会贪心算法无效的例子==
2034

21-
### 1.2.2 贪心算法的证明问题
35+
<h3 id='122'>1.2.2 贪心算法的证明问题</h3>
2236

2337
如何证明贪心算法的有效性?
2438

@@ -207,17 +221,17 @@ public class Code01_LowestLexicography {
207221
208222
==贪心策略算法,尽量不要陷入复杂的证明==
209223

210-
## 1.2 贪心算法求解思路
224+
<h2 id='12'>1.2 贪心算法求解思路</h2>
211225

212-
### 1.2.1 标准求解过程
226+
<h3 id='121'>1.2.1 标准求解过程</h3>
213227

214228
1、分析业务
215229

216230
2、根据业务逻辑找到不同的贪心策略
217231

218232
3、对于能举出反例的策略,直接跳过,不能举出反例的策略要证明有效性,这往往是比较困难的,要求数学能力很高且不具有统一的技巧性
219233

220-
### 1.2.2 贪心算法解题套路
234+
<h3 id='122'>1.2.2 贪心算法解题套路</h3>
221235

222236
1、实现一个不依靠贪心策略的解法X,可以用暴力尝试
223237

@@ -229,9 +243,9 @@ public class Code01_LowestLexicography {
229243

230244
> 贪心类的题目在笔试中,出现的概率高达6到7成,而面试中出现贪心的概率不到2成。因为笔试要的是淘汰率,面试要的是区分度。由于贪心的解决完全取决于贪心策略有没有想对,有很高的淘汰率但是没有很好的区分度
231245
232-
## 1.3 贪心算法套路解题实战
246+
<h2 id='13'>1.3 贪心算法套路解题实战</h2>
233247

234-
### 1.3.1 例一:会议日程安排问题
248+
<h3 id='131'>1.3.1 例一:会议日程安排问题</h3>
235249

236250
一些项目要占用一个会议室宣讲,会议室不能同时容纳两个项目宣讲。给你每个项目的开始时间和结束时间,你来安排宣讲的日程,要求会议室进行宣讲的场数最多。
237251

@@ -360,7 +374,7 @@ public class Code04_BestArrange {
360374

361375
```
362376

363-
### 1.3.2 例二:居民楼路灯问题
377+
<h3 id='132'>1.3.2 例二:居民楼路灯问题</h3>
364378

365379
给定一个字符串str,只由‘X’和‘.’两中国字符构成。
366380

@@ -475,7 +489,7 @@ public class Code02_Light {
475489

476490
```
477491

478-
### 1.3.3 例三:哈夫曼树问题
492+
<h3 id='133'>1.3.3 例三:哈夫曼树问题</h3>
479493

480494
一根金条切成两半,是需要花费和长度值一样的铜板的。
481495

@@ -575,7 +589,7 @@ public class Code03_LessMoneySplitGold {
575589
}
576590
```
577591

578-
### 1.3.4 例四:项目花费和利润问题
592+
<h3 id='134'>1.3.4 例四:项目花费和利润问题</h3>
579593

580594
输入:正数数组costs,正数数组profits,正数K,正数M
581595

docs/10.md

Lines changed: 42 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,29 @@
1-
# 1 并查集、图相关算法
21

3-
## 1.1 并查集
4-
5-
### 1.1.1 并查集基本结构和操作
2+
- [1 并查集、图相关算法](#1)
3+
* [1.1 并查集](#11)
4+
+ [1.1.1 并查集基本结构和操作](#111)
5+
+ [1.1.2 例题](#112)
6+
* [1.2 图相关算法](#12)
7+
+ [1.2.1 图的概念](#121)
8+
+ [1.2.2 图的表示方法](#122)
9+
- [1.2.2.1 邻接表表示法](#1221)
10+
- [1.2.2.2 邻接矩阵表示法](#1222)
11+
+ [1.2.3 图的遍历](#123)
12+
- [1.2.3.1 宽度优先遍历](#1231)
13+
- [1.2.3.2 深度优先遍历](#1232)
14+
+ [1.2.4 图的拓扑排序](#124)
15+
+ [1.2.5 图的最小生成树算法](#125)
16+
- [1.2.5.1 Kruskal(克鲁斯卡尔)算法](#1251)
17+
- [1.2.5.2 Prim算法](#1252)
18+
+ [1.2.6 图的最短路径算法](#126)
19+
- [1.2.6.1 Dijkstra(迪杰特斯拉)算法](#1261)
20+
- [1.2.6.2 floyd算法](#1262)
21+
22+
<h1 id='1'>1 并查集、图相关算法</h1>
23+
24+
<h2 id='11'>1.1 并查集</h2>
25+
26+
<h3 id='111'>1.1.1 并查集基本结构和操作</h3>
627

728
1、有若干个样本a、b、c、d...类型假设是V
829

@@ -129,7 +150,7 @@ public class Code01_UnionFind {
129150
```
130151
==并查集用来处理连通性的问题特别方便==
131152

132-
### 1.1.2 例题
153+
<h3 id='112'>1.1.2 例题</h3>
133154

134155
学生实例有三个属性,身份证信息,B站ID,Github的Id。我们认为,任何两个学生实例,只要身份证一样,或者B站ID一样,或者Github的Id一样,我们都算一个人。给定一打拼学生实例,输出有实质有几个人?
135156

@@ -257,16 +278,17 @@ public class Code07_MergeUsers {
257278
}
258279
```
259280

260-
## 1.2 图相关算法
261-
### 1.2.1 图的概念
281+
<h2 id='12'>1.2 图相关算法</h2>
282+
283+
<h3 id='121'>1.2.1 图的概念</h3>
262284

263285
1、由点的集合和边的集合构成
264286

265287
2、虽然存在有向图和无向图的概念,但实际上都可以用有向图来表达,无向图可以理解为两个联通点互相指向
266288

267289
3、边上可能带有权值
268290

269-
### 1.2.2 图的表示方法
291+
<h3 id='122'>1.2.2 图的表示方法</h3>
270292

271293
对于下面一张无向图,可以改为有向图:
272294

@@ -282,7 +304,7 @@ D-->A
282304
A-->D
283305
```
284306

285-
#### 1.2.2.1 邻接表表示法
307+
<h4 id='1221'>1.2.2.1 邻接表表示法</h4>
286308

287309
记录某个节点,直接到达的邻居节点:
288310

@@ -296,8 +318,7 @@ D: B,A
296318

297319
如果是带有权重的边,可以封装我们的结构,例如A到C的权重是3,那么我们可以表示为A: C(3),D
298320

299-
300-
#### 1.2.2.2 邻接矩阵表示法
321+
<h4 id='1222'>1.2.2.2 邻接矩阵表示法</h4>
301322

302323
我们把不存在路径的用正无穷表示,这里用'-'表示,例如A到C的边权重是3,可把上图表示为:
303324

@@ -442,7 +463,7 @@ public class GraphGenerator {
442463
}
443464
```
444465

445-
### 1.2.3 图的遍历
466+
<h3 id='123'>1.2.3 图的遍历</h3>
446467

447468
例如该图:
448469

@@ -459,7 +480,7 @@ C-->D
459480
C-->E
460481
```
461482

462-
#### 1.2.3.1 宽度优先遍历
483+
<h4 id='1231'>1.2.3.1 宽度优先遍历</h4>
463484

464485
1、利用队列实现
465486

@@ -519,7 +540,7 @@ public class Code02_BFS {
519540
}
520541
```
521542

522-
#### 1.2.3.2 深度优先遍历
543+
<h4 id='1232'>1.2.3.2 深度优先遍历</h4>
523544

524545
1、利用栈实现
525546

@@ -584,7 +605,7 @@ public class Code02_DFS {
584605
}
585606
```
586607

587-
### 1.2.4 图的拓扑排序
608+
<h3 id='124'>1.2.4 图的拓扑排序</h3>
588609

589610
1、在图中找到所有入度为0的点输出
590611

@@ -666,11 +687,11 @@ public class Code03_TopologySort {
666687
}
667688
```
668689

669-
### 1.2.5 图的最小生成树算法
690+
<h3 id='125'>1.2.5 图的最小生成树算法</h3>
670691

671692
> 最小生成树解释,就是在不破坏原有图点与点的连通性基础上,让连通的边的整体权值最小。返回最小权值或者边的集合
672693
673-
#### 1.2.5.1 Kruskal(克鲁斯卡尔)算法
694+
<h4 id='1251'>1.2.5.1 Kruskal(克鲁斯卡尔)算法</h4>
674695

675696
> 连通性借助并查集实现
676697
@@ -800,7 +821,7 @@ public class Code04_Kruskal {
800821
```
801822
> K算法求无向图的最小生成树,求权值是没问题的,如果纠结最小生成树的连通结构,实质是少了一侧,即A指向B, B指向A只会保留其一。可以手动补齐
802823
803-
#### 1.2.5.2 Prim算法
824+
<h4 id='1252'>1.2.5.2 Prim算法</h4>
804825

805826
> P算法无需并查集结构,普通set即可满足
806827
@@ -925,9 +946,9 @@ public class Code05_Prim {
925946
}
926947
```
927948

928-
### 1.2.6 图的最短路径算法
949+
<h3 id='126'>1.2.6 图的最短路径算法</h3>
929950

930-
#### 1.2.6.1 Dijkstra(迪杰特斯拉)算法
951+
<h4 id='1261'>1.2.6.1 Dijkstra(迪杰特斯拉)算法</h4>
931952

932953
> Dijkstra算法必须要求边的权值不为负,且必须指定出发点。则可以求出发点到所有节点的最短距离是多少。如果到达不了,为正无穷
933954
@@ -1159,7 +1180,6 @@ public class Code06_Dijkstra {
11591180

11601181
}
11611182
```
1162-
1163-
#### 1.2.6.2 floyd算法
1183+
<h4 id='1262'>1.2.6.2 floyd算法</h4>
11641184

11651185
> 图节点的最短路径,处理权值可能为负的情况。三层for循环,比较简单

0 commit comments

Comments
 (0)