Skip to content

Commit 5df66ef

Browse files
author
ningfeng
committed
进阶锚点添加 +
1 parent 848a3cb commit 5df66ef

File tree

9 files changed

+191
-97
lines changed

9 files changed

+191
-97
lines changed

docs/13.md

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,20 @@
1-
# 1 单调栈和窗口及其更新结构
1+
- [1 单调栈和窗口及其更新结构](#1)
2+
* [1.1 窗口](#11)
3+
+ [1.1.1 滑动窗口是什么?](#111)
4+
+ [1.1.2 滑动窗口能做什么?](#112)
5+
+ [1.1.3 维护窗口滑动的更新结构](#113)
6+
+ [1.1.4 高频题:求滑动窗口最大值](#114)
7+
+ [1.1.5 高频题二:达标子数组数量问题](#115)
8+
+ [1.1.6 如何优化一个问题?](#116)
9+
* [1.2 单调栈](#12)
10+
+ [1.2.1 单调栈结构](#121)
11+
+ [1.2.2 单调栈的应用](#122)
212

3-
## 1.1 窗口
13+
<h1 id='1'>1 单调栈和窗口及其更新结构</h1>
414

5-
### 1.1.1 滑动窗口是什么?
15+
<h2 id='11'>1.1 窗口</h2>
16+
17+
<h3 id='111'>1.1.1 滑动窗口是什么?</h3>
618

719
> 窗口只是我们脑海中的一个范围,用过L和R来规定我们窗口的边界。保证L<=R这个条件
820
@@ -16,12 +28,12 @@
1628

1729
5、 L和R都只能往右滑动
1830

31+
<h3 id='112'>1.1.2 滑动窗口能做什么?</h3>
1932

20-
### 1.1.2 滑动窗口能做什么?
2133

2234
滑动窗口、首尾指针等技巧,说白了就是一种求解问题的流程设计。
2335

24-
### 1.1.3 维护窗口滑动的更新结构
36+
<h3 id='113'>1.1.3 维护窗口滑动的更新结构</h3>
2537

2638
> 例如我们求窗口内最大值问题
2739
@@ -41,7 +53,7 @@
4153
复杂度:窗口滑动经过的数,最多进双端队列一次,最多出双端队列一次,如果窗口滑动了N个数,时间复杂度就是O(N),单次平均O(1)。
4254

4355

44-
### 1.1.4 高频题:求滑动窗口最大值
56+
<h3 id='114'>1.1.4 高频题:求滑动窗口最大值</h3>
4557

4658
假设一个固定大小为W的窗口,以此划过arr,返回每一次划出状况的最大值
4759

@@ -168,7 +180,7 @@ public class Code01_SlidingWindowMaxArray {
168180

169181
```
170182

171-
### 1.1.5 高频题二:达标子数组数量问题
183+
<h3 id='115'>1.1.5 高频题二:达标子数组数量问题</h3>
172184

173185
给定一个整形数组arr,和衣蛾整数num。某个arr中的子数组sub,如果想达标,必须满足:sub中最大值-sub中最小值<=num,返回arr中达标子数组的数量
174186

@@ -279,17 +291,18 @@ public class Code02_AllLessNumSubArray {
279291

280292
> 本题根据窗口滑动建立了单调性,上文的结论
281293
282-
### 1.1.6 如何优化一个问题?
294+
<h3 id='116'>1.1.6 如何优化一个问题?</h3>
283295

284296
1、 数据状况层面是否可以优化
285297

286298
2、 问题本身是否可以优化。单调性,首位指针(头指针往右走,尾指针往左走)等
287299

288300
> 遇到一个问题我们先观察,问题本身和范围是否可以建立单调性,至于需要用哪个原型来解决,串口和首位指针法是常见的流程。所以窗口和首位指针主要用来解决单调性的
289301
290-
## 1.2 单调栈
302+
<h2 id='12'>1.2 单调栈</h2>
303+
291304

292-
### 1.2.1 单调栈结构
305+
<h3 id='121'>1.2.1 单调栈结构</h3>
293306

294307
在一个数组中,求每一个位置左边离它最近的比它小的数在哪,右边离它最近的比它小的数在哪。
295308

@@ -497,7 +510,7 @@ public class Code03_MonotonousStack {
497510

498511
```
499512

500-
### 1.2.2 单调栈的应用
513+
<h3 id='122'>1.2.2 单调栈的应用</h3>
501514

502515
给定一个只包含正整数的数组arr,arr中任何一个子数组sub,一定都可以算出(sub累加和)*(sub中的最小值)是什么,那么所有子数组中,这个值最大是多少?
503516

docs/14.md

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,19 @@
1-
# 1 类似斐波那契数列的递归
21

3-
## 1.1 求斐波那契数列矩阵乘法的方法
2+
- [1 类似斐波那契数列的递归](#1)
3+
* [1.1 求斐波那契数列矩阵乘法的方法](#11)
4+
* [1.2 菲波那切数列可优化为O(logN)时间复杂度](#12)
5+
+ [1.2.1 矩阵加快速幂方法](#121)
6+
- [1.2.1.1 矩阵推导](#1211)
7+
- [1.2.1.2 快速幂转化思路](#1212)
8+
* [1.3 递推推广式](#13)
9+
* [1.4 迈楼梯问题](#14)
10+
* [1.5 递推经典例题一](#15)
11+
* [1.6 递推经典例题二](#16)
12+
13+
<h1 id='1'>1 类似斐波那契数列的递归</h1>
14+
15+
16+
<h2 id='11'>1.1 求斐波那契数列矩阵乘法的方法</h2>
417

518
1、菲波那切数列的线性求解(O(N))的方法非常好理解(一次遍历,N项依赖于N-1项和N-2项)
619

@@ -9,11 +22,11 @@
922
3、求出这二阶矩阵,进而最快求出这个二阶矩阵的N-2次方
1023

1124

12-
## 1.2 菲波那切数列可优化为O(logN)时间复杂度
25+
<h2 id='12'>1.2 菲波那切数列可优化为O(logN)时间复杂度</h2>
1326

14-
### 1.2.1 矩阵加快速幂方法
27+
<h3 id='121'>1.2.1 矩阵加快速幂方法</h3>
1528

16-
#### 1.2.1.1 矩阵推导
29+
<h4 id='1211'>1.2.1.1 矩阵推导</h4>
1730

1831
> 由于菲波那切数列是一个严格的递推式,不会发生条件转移。
1932
@@ -63,7 +76,8 @@
6376
6477
> 转化为,怎么求多个相同矩阵乘起来,怎么算比较快的问题?我们先思考怎么求一个数乘方怎么算比较快的问题?
6578
66-
#### 1.2.1.2 快速幂转化思路
79+
<h4 id='1212'>1.2.1.2 快速幂转化思路</h4>
80+
6781

6882
问:怎么快速求出10的75次方的值是多少。
6983

@@ -83,8 +97,7 @@
8397

8498
**在JDK中,Math.power函数的内部,也是这样实现指数函数的(整数次方)**
8599

86-
87-
## 1.3 递推推广式
100+
<h2 id='13'>1.3 递推推广式</h2>
88101

89102
如果某一个递推式,`F(N) = c1F(n-1) + C2F(n-2) + ... + czF(N-k)` k表示最底层减到多少,我们称之为k阶递归式。c1,c2,cz为常数系数,k为常数,那么都有O(logN)的解。系数只会影响到我们的k阶矩阵的不同
90103

@@ -310,7 +323,7 @@ public class Code01_FibonacciProblem {
310323

311324
```
312325

313-
## 1.4 迈楼梯问题
326+
<h2 id='14'>1.4 迈楼梯问题</h2>
314327

315328
问题描述:小明想要迈到n层台阶上去,可以一次迈一层台阶,可以一次迈两层台阶。问:迈到n层一共可以有多少种方法
316329

@@ -344,7 +357,7 @@ F(N) = F(n-1) + F(n-3) - F(n-10)
344357

345358
==每年,这种问题在面试笔试中大量出现,兔子生乌龟问题,乌龟生兔子问题,等等,层出不穷,都可以用这种方法模型求解==
346359

347-
## 1.5 递推经典例题一
360+
<h2 id='15'>1.5 递推经典例题一</h2>
348361

349362
题目描述:给定一个数N,想象只有0和1两种字符,组成的所有长度为N的字符串。如果某个字符串,任何0字符的左边都有1紧挨着,认为这个字符串达标,返回有多少达标的字符串
350363

@@ -362,7 +375,8 @@ F(N) = F(n-1) + F(n-3) - F(n-10)
362375
f(i) = f(i-1) + f(i-2)
363376
```
364377

365-
## 1.6 递推经典例题二
378+
<h2 id='16'>1.6 递推经典例题二</h2>
379+
366380

367381
题目描述:有一款2行,N列的区域。假设我们只有1*2大小的瓷砖,我们把该区域填满有多少种方案?
368382

docs/15.md

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,17 @@
1-
# 1 KMP算法
1+
- [1 KMP算法](#1)
2+
* [1.1 KMP算法分析](#11)
3+
* [1.2 KMP算法应用](#12)
4+
+ [1.2.1 题目1:旋转词](#121)
5+
+ [1.2.2 题目2:子树问题](#122)
6+
- [2 bfprt算法](#2)
7+
* [2.1 bfprt算法分析](#21)
8+
* [2.2 bfprt算法应用](#22)
9+
10+
<h1 id='1'>1 KMP算法</h1>
211

312
`大厂劝退,面试高频^_^`
413

5-
## 1.1 KMP算法分析
14+
<h2 id='11'>1.1 KMP算法分析</h2>
615

716
查找字符串问题:例如我们有一个字符串str="abc1234efd"和match="1234"。我们如何查找str字符串中是否包含match字符串的子串?
817

@@ -137,9 +146,9 @@ public class Code01_KMP {
137146
}
138147
```
139148

140-
## 1.2 KMP算法应用
149+
<h2 id='12'>1.2 KMP算法应用</h2>
141150

142-
### 题目1:旋转词
151+
<h3 id='121'>1.2.1 题目1:旋转词</h3>
143152

144153
例如Str1="123456",对于Str1的旋转词,字符串本身也是其旋转词,Str1="123456"的旋转词为,"123456","234561","345612","456123","561234","612345"。给定Str1和Str2,那么判断这个两个字符串是否互为旋转词?是返回true,不是返回false
145154

@@ -148,14 +157,12 @@ public class Code01_KMP {
148157

149158
KMP解法:str1拼接str1得到str',"123456123456",我们看str2是否是str'的子串
150159

151-
152-
### 题目2:子树问题
160+
<h3 id='122'>1.2.2 题目2:子树问题</h3>
153161

154162
给定两颗二叉树头结点,node1和node2,判断node2为头结点的树,是不是node1的某个子树?
155163

156164

157-
158-
# 2 bfprt算法
165+
<h1 id='2'>2 bfprt算法</h1>
159166

160167
`面试常见`
161168

@@ -168,7 +175,7 @@ KMP解法:str1拼接str1得到str',"123456123456",我们看str2是否是str'
168175

169176
思路2:bfprt算法,不使用概率求期望,复杂度仍然严格收敛到O(N)
170177

171-
## 2.1 bfprt算法分析
178+
<h2 id='21'>2.1 bfprt算法分析</h2>
172179

173180
通过上文,利用荷兰国旗问题的思路为:
174181

@@ -396,7 +403,7 @@ public class Code01_FindMinKth {
396403
}
397404
```
398405

399-
## 2.2 bfprt算法应用
406+
<h2 id='22'>2.2 bfprt算法应用</h2>
400407

401408
题目:求一个数组中,拿出所有比第k小的数还小的数
402409

docs/16.md

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
1-
# 1 Manacher算法
1+
- [1 Manacher算法](#1)
2+
* [1.1 简介](#11)
3+
* [1.2 字符串最长回文子串暴力解](#12)
4+
* [1.3 Manacher解决最长回文串O(N)](#13)
5+
* [1.4 例题](#14)
26

3-
## 1.1 简介
7+
<h1 id='1'>1 Manacher算法</h1>
8+
9+
10+
<h2 id='11'>1.1 简介</h2>
411

512
回文串概念:一个字符串是轴对称的,轴的左侧和右侧是逆序的关系,例如"abcba","abccba"
613

@@ -9,8 +16,7 @@ Manacher算法解决在一个字符串中最长回文子串的大小,例如"ab
916

1017
回文串的用途,例如我们可以把DNA当成一个字符串,有一些基因片段是回文属性的,在生理学上有实际意义
1118

12-
13-
## 1.2 字符串最长回文子串暴力解
19+
<h2 id='12'>1.2 字符串最长回文子串暴力解</h2>
1420

1521
遍历str,以i为回文对称的回文串有多长,在i位置左右扩展。所以字符串"abc123df"
1622

@@ -43,7 +49,7 @@ i为8的时候,回文串为"#1#2#1#1#2#1#",长度为13;
4349

4450
Manacher算法解决该类问题,O(N)复杂度!
4551

46-
## 1.3 Manacher解决最长回文串O(N)
52+
<h2 id='13'>1.3 Manacher解决最长回文串O(N)</h2>
4753

4854
概念1:回文半径和回文直径,回文直径指的是,在我们填充串中,每个位置找到的回文串的整体长度,回文半径指的是在填充串中回文串从i位置到左右边界的一侧的长度
4955

@@ -173,7 +179,8 @@ public class Code01_Manacher {
173179
}
174180
```
175181

176-
## 1.4 例题
182+
<h2 id='14'>1.4 例题</h2>
183+
177184

178185
给定一个字符串str,只可在str后添加字符,把该串变成回文字符串最少需要多少个字符?
179186

docs/17.md

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,19 @@
1-
# 1 Morris遍历
1+
- [1 Morris遍历](#1)
2+
* [1.1 Morris遍历目的](#11)
3+
+ [1.1.1 算法流程](#111)
4+
+ [1.1.2 时间复杂度估计](#112)
5+
* [1.2 Morris遍历的应用](#12)
6+
* [1.3 Morris遍历为最优解的情景](#13)
27

3-
## 1.1 Morris遍历目的
8+
<h1 id='1'>1 Morris遍历</h1>
9+
10+
11+
<h2 id='11'>1.1 Morris遍历目的</h2>
412

513
在二叉树的遍历中,有递归方式遍历和非递归遍历两种。不管哪种方式,时间复杂度为O(N),空间复杂度为O(h),h为树的高度。Morris遍历可以在时间复杂度O(N),空间复杂度O(1)实现二叉树的遍历
614

715

8-
### 算法流程
16+
<h3 id='111'>1.1.1 算法流程</h3>
917

1018
从一个树的头结点cur开始:
1119

@@ -37,7 +45,7 @@ cur经过的路径也就是Morris序为:1,2,4,2,5,1,3,6,3,7
3745

3846
翻转链表:例如a->b->c->d->null。可以让a-null,b->a,c->b,d->c即可。打印完之后把链表再翻转过来
3947

40-
### 时间复杂度估计
48+
<h3 id='112'>1.1.2 时间复杂度估计</h3>
4149

4250
cur来到节点的时间复杂度为O(N),每个cur遍历左树最右边界的代价最多为O(2N),所以整个遍历过程为O(N),整个遍历过程只用到到有限的几个变量,其他使用的都是树本身的指针关系。
4351

@@ -283,8 +291,7 @@ public class Code01_MorrisTraversal {
283291
}
284292
```
285293

286-
287-
## 1.2 Morris遍历的应用
294+
<h2 id='12'>1.2 Morris遍历的应用</h2>
288295

289296
在一颗二叉树中,求该二叉树的最小高度。最小高度指的是,所有叶子节点距离头节点的最小值
290297

@@ -411,7 +418,8 @@ public class Code05_MinHeight {
411418
}
412419
```
413420

414-
## 1.3 Morris遍历为最优解的情景
421+
422+
<h2 id='13'>1.3 Morris遍历为最优解的情景</h2>
415423

416424
> 如果我们算法流程设计成,每来到一个节点,需要左右子树的信息进行整合,那么无法使用Morris遍历。该种情况的空间复杂度也一定不是O(1)的
417425

docs/18.md

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,11 @@
1-
# 1 线段树(又名为线段修改树)
1+
- [1 线段树(又名为线段修改树)](#1)
2+
* [1.1 线段树概念建立](#11)
3+
+ [1.1.1 累加和数组建立](#111)
4+
+ [1.1.2更新结构数组建立](#112)
5+
* [1.2 线段树案例实战](#12)
6+
* [1.3 什么样的题目可以用线段树来解决?](#13)
7+
8+
<h1 id='1'>1 线段树(又名为线段修改树)</h1>
29

310
线段树所要解决的问题是,区间的修改,查询和更新,如何更新查询的更快?
411

@@ -17,9 +24,9 @@ int getSum(int L, int R, int[] arr);
1724
```
1825

1926

20-
## 1.1 线段树概念建立
27+
<h2 id='11'>1.1 线段树概念建立</h2>
2128

22-
### 1.1.1 累加和数组建立
29+
<h3 id='111'>1.1.1 累加和数组建立</h3>
2330

2431
1、对于大小为n的数组,我们二分它,每次二分我们都记录一个信息
2532

@@ -66,7 +73,7 @@ graph TD
6673
得到累加和信息的分布树的大小,和值的情况,那么update更新树,和add累加树,同样的大小和同样的坐标关系构建。
6774

6875

69-
### 1.1.2更新结构数组建立
76+
<h3 id='112'>1.1.2更新结构数组建立</h3>
7077

7178
懒更新概念,例如有8个数,我们要把1到6的数都减小2。那么先看1到6是否完全囊括8个数,如果囊括直接更新。很显然这里没有囊括,记录要更新1到6,下发该任务给1到4和5到8。1到6完全囊括1到4,记录到lazy中,不再下发;5到8没有囊括1到6,继续下发给5到6和7到8,5到6被囊括,记录到lazy不再继续下发,7到8不接受该任务
7279

@@ -368,7 +375,7 @@ public class Code01_SegmentTree {
368375
}
369376
```
370377

371-
## 1.2 线段树案例实战
378+
<h2 id='12'>1.2 线段树案例实战</h2>
372379

373380
想象一下标准的俄罗斯方块游戏,X轴是积木最终下落到底的轴线
374381
下面是这个游戏的简化版:
@@ -501,8 +508,7 @@ public class Code02_FallingSquares {
501508

502509
本题为leetCode原题:https://leetcode.com/problems/falling-squares/
503510

504-
505-
## 1.3 什么样的题目可以用线段树来解决?
511+
<h2 id='13'>1.3 什么样的题目可以用线段树来解决?</h2>
506512

507513
区间范围上,统一增加,或者统一更新一个值。大范围信息可以只由左、右两侧信息加工出,
508514
而不必遍历左右两个子范围的具体状况

0 commit comments

Comments
 (0)