Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 15 additions & 16 deletions Assets/Origins/README-Catalogue-List.md
Original file line number Diff line number Diff line change
@@ -1,16 +1,14 @@
# 内容章节

## 00. 绪论
### 00. 绪论

- [算法与数据结构](https://github.com/itcharge/LeetCode-Py/blob/main/Contents/00.Introduction/01.Data-Structures-Algorithms.md)
- [算法复杂度](https://github.com/itcharge/LeetCode-Py/blob/main/Contents/00.Introduction/02.Algorithm-Complexity.md)
- [LeetCode 入门与攻略](https://github.com/itcharge/LeetCode-Py/blob/main/Contents/00.Introduction/03.LeetCode-Guide.md)
- [LeetCode 题解(字典序排序,700+ 道题解)](https://github.com/itcharge/LeetCode-Py/blob/main/Contents/00.Introduction/04.Solutions-List.md)
- [LeetCode 题解(字典序排序,850+ 道题解)](https://github.com/itcharge/LeetCode-Py/blob/main/Contents/00.Introduction/04.Solutions-List.md)
- [LeetCode 题解(按分类排序,推荐刷题列表 ★★★)](https://github.com/itcharge/LeetCode-Py/blob/main/Contents/00.Introduction/05.Categories-List.md)
- [LeetCode 面试最常考 100 题(按分类排序)](https://github.com/itcharge/LeetCode-Py/blob/main/Contents/00.Introduction/06.Interview-100-List.md)
- [LeetCode 面试最常考 200 题(按分类排序)](https://github.com/itcharge/LeetCode-Py/blob/main/Contents/00.Introduction/07.Interview-200-List.md)

## 01. 数组
### 01. 数组

- 数组基础知识
- [数组基础知识](https://github.com/itcharge/LeetCode-Py/blob/main/Contents/01.Array/01.Array-Basic/01.Array-Basic.md)
Expand Down Expand Up @@ -38,7 +36,7 @@
- [数组滑动窗口知识](https://github.com/itcharge/LeetCode-Py/blob/main/Contents/01.Array/05.Array-Sliding-Window/01.Array-Sliding-Window.md)
- [数组滑动窗口题目](https://github.com/itcharge/LeetCode-Py/blob/main/Contents/01.Array/05.Array-Sliding-Window/02.Array-Sliding-Window-List.md)

## 02. 链表
### 02. 链表

- 链表基础知识
- [链表基础知识](https://github.com/itcharge/LeetCode-Py/blob/main/Contents/02.Linked-List/01.Linked-List-Basic/01.Linked-List-Basic.md)
Expand All @@ -50,7 +48,7 @@
- [链表双指针知识](https://github.com/itcharge/LeetCode-Py/blob/main/Contents/02.Linked-List/03.Linked-List-Two-Pointers/01.Linked-List-Two-Pointers.md)
- [链表双指针题目](https://github.com/itcharge/LeetCode-Py/blob/main/Contents/02.Linked-List/03.Linked-List-Two-Pointers/02.Linked-List-Two-Pointers-List.md)

## 03. 堆栈
### 03. 堆栈

- 堆栈基础知识
- [堆栈基础知识](https://github.com/itcharge/LeetCode-Py/blob/main/Contents/03.Stack/01.Stack-Basic/01.Stack-Basic.md)
Expand All @@ -59,7 +57,7 @@
- [单调栈知识](https://github.com/itcharge/LeetCode-Py/blob/main/Contents/03.Stack/02.Monotone-Stack/01.Monotone-Stack.md)
- [单调栈题目](https://github.com/itcharge/LeetCode-Py/blob/main/Contents/03.Stack/02.Monotone-Stack/02.Monotone-Stack-List.md)

## 04. 队列
### 04. 队列

- 队列基础知识
- [队列基础知识](https://github.com/itcharge/LeetCode-Py/blob/main/Contents/04.Queue/01.Queue-Basic/01.Queue-Basic.md)
Expand All @@ -68,12 +66,12 @@
- [优先队列知识](https://github.com/itcharge/LeetCode-Py/blob/main/Contents/04.Queue/02.Priority-Queue/01.Priority-Queue.md)
- [优先队列题目](https://github.com/itcharge/LeetCode-Py/blob/main/Contents/04.Queue/02.Priority-Queue/02.Priority-Queue-List.md)

## 05. 哈希表
### 05. 哈希表

- [哈希表知识](https://github.com/itcharge/LeetCode-Py/blob/main/Contents/05.Hash-Table/01.Hash-Table.md)
- [哈希表题目](https://github.com/itcharge/LeetCode-Py/blob/main/Contents/05.Hash-Table/02.Hash-Table-List.md)

## 06. 字符串
### 06. 字符串

- 字符串基础知识
- [字符串基础知识](https://github.com/itcharge/LeetCode-Py/blob/main/Contents/06.String/01.String-Basic/01.String-Basic.md)
Expand All @@ -93,9 +91,8 @@
- [AC 自动机题目](https://github.com/itcharge/LeetCode-Py/blob/main/Contents/06.String/03.String-Multi-Pattern-Matching/04.AC-Automaton-List.md)
- [后缀数组知识](https://github.com/itcharge/LeetCode-Py/blob/main/Contents/06.String/03.String-Multi-Pattern-Matching/05.Suffix-Array.md)
- [后缀数组题目](https://github.com/itcharge/LeetCode-Py/blob/main/Contents/06.String/03.String-Multi-Pattern-Matching/06.Suffix-Array-List.md)


## 07. 树
### 07. 树

- 二叉树
- [树与二叉树基础知识](https://github.com/itcharge/LeetCode-Py/blob/main/Contents/07.Tree/01.Binary-Tree/01.Binary-Tree-Basic.md)
Expand All @@ -116,7 +113,7 @@
- [并查集知识](https://github.com/itcharge/LeetCode-Py/blob/main/Contents/07.Tree/05.Union-Find/01.Union-Find.md)
- [并查集题目](https://github.com/itcharge/LeetCode-Py/blob/main/Contents/07.Tree/05.Union-Find/02.Union-Find-List.md)

## 08. 图论
### 08. 图论

- 图的基础知识
- [图的定义和分类](https://github.com/itcharge/LeetCode-Py/blob/main/Contents/08.Graph/01.Graph-Basic/01.Graph-Basic.md)
Expand Down Expand Up @@ -149,7 +146,7 @@
- [Hopcroft-Karp 算法](https://github.com/itcharge/LeetCode-Py/blob/main/Contents/08.Graph/05.Graph-Bipartite/05.Graph-Hopcroft-Karp.md)
- [二分图最大匹配题目](https://github.com/itcharge/LeetCode-Py/blob/main/Contents/08.Graph/05.Graph-Bipartite/06.Graph-Bipartite-Matching-List.md)

## 09. 基础算法
### 09. 基础算法

- 枚举算法
- [枚举算法知识](https://github.com/itcharge/LeetCode-Py/blob/main/Contents/09.Algorithm-Base/01.Enumeration-Algorithm/01.Enumeration-Algorithm.md)
Expand All @@ -170,7 +167,7 @@
- [位运算知识](https://github.com/itcharge/LeetCode-Py/blob/main/Contents/09.Algorithm-Base/06.Bit-Operation/01.Bit-Operation.md)
- [位运算题目](https://github.com/itcharge/LeetCode-Py/blob/main/Contents/09.Algorithm-Base/06.Bit-Operation/02.Bit-Operation-List.md)

## 10. 动态规划
### 10. 动态规划

- 动态规划基础
- [动态规划基础知识](https://github.com/itcharge/LeetCode-Py/blob/main/Contents/10.Dynamic-Programming/01.Dynamic-Programming-Basic/01.Dynamic-Programming-Basic.md)
Expand Down Expand Up @@ -213,4 +210,6 @@
- [四边形不等式优化](https://github.com/itcharge/LeetCode-Py/blob/main/Contents/10.Dynamic-Programming/11.DP-Optimization/03.Quadrangle-Optimization.md)
- [动态规划优化题目](https://github.com/itcharge/LeetCode-Py/blob/main/Contents/10.Dynamic-Programming/11.DP-Optimization/04.DP-Optimization-List.md)

## 11. 附加内容
### 11. 附加内容

- [内容完成时间线](./Contents/Others/Update-Time.md)
19 changes: 12 additions & 7 deletions Assets/Origins/README-Head.md
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
# 算法通关手册(LeetCode)

## 项目简介
## 01. 项目简介

- **「算法与数据结构」** 基础知识的讲解教程,「LeetCode」800+ 道题目的详细解析。本项目易于理解,没有大跨度的思维跳跃,项目中使用部分图示、例子来帮助理解。

- 本教程先从基础的数据结构和算法开始讲解,再针对不同分类的数据结构和算法,进行具体题目的讲解分析。让读者可以通过「算法基础理论学习」和「编程实战学习」相结合的方式,彻底的掌握算法知识。

- 本教程采用 Python 作为编程语言,要求学习者已有基本 Python 程序设计的知识与经验。

## 项目地址
## 02. 项目地址

欢迎右上角 **「Star ⭐️ 」** 和 **「Fork」**,这是对我最大的鼓励和支持。

Expand All @@ -18,11 +18,11 @@

- 电子书地址:[https://algo.itcharge.cn](https://algo.itcharge.cn)

![](./Assets/Images/algo-book-light.png)
![电子书浅色模式](./Assets/Images/algo-book-light.png)

![](./Assets/Images/algo-book-dark.png)
![电子书深色模式](./Assets/Images/algo-book-dark.png)

## 关于作者
## 03. 关于作者

我是一名 iOS / macOS 的开发程序员,另外也是北航软院的一名非全硕士(在读)。曾在大学期间学习过算法知识,并参加过 3 年的 ACM 比赛, 但水平有限,未能取得理想成绩。但是这 3 年的 ACM 经历,给我最大的收获是锻炼了自己的逻辑思维和解决实际问题的能力,这种能力为我今后的工作、学习打下了坚实的基础。

Expand All @@ -35,7 +35,12 @@

![](./Assets/Images/itcharge-qr-code.png)

## 版权说明
## 04. 版权说明

- 本教程采用 [知识署名—非商业性使用—禁止演绎(BY-NC-ND)4.0 协议国际许可协议](https://creativecommons.org/licenses/by-nc-nd/4.0/legalcode.zh-Hans) 进行许可。
- 本教程题解中的所有题目版权均归 [LeetCode](https://leetcode.com/) 和 [力扣中国](https://leetcode.cn/) 所有。
- 本教程题解中的所有题目版权均归 [LeetCode](https://leetcode.com/) 和 [力扣中国](https://leetcode.cn/) 所有。

## 05. 章节目录

![章节目录](./Assets/Images/algo-book-contents.png)

4 changes: 3 additions & 1 deletion Assets/Scripts/create_solutions_list.py
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ def merge_readme_file(solotions_output_path, readme_head_path, readme_catalogue_
catalogue_list_lines = catalogue_list_file.readlines()
if len(catalogue_list_lines) > 0:
catalogue_list_title = catalogue_list_lines[0].strip('\n')
catalogue_list_title = '## [' + catalogue_list_title + '](./Contents/00.Introduction/04.Solutions-List.md)'
catalogue_list_title = '### [' + catalogue_list_title + '](./Contents/00.Introduction/04.Solutions-List.md)'
catalogue_list_title = catalogue_list_title.replace('# LeetCode 题解', '12. LeetCode 题解')
readme_file.writelines(catalogue_list_title)
catalogue_list_file.close()
Expand All @@ -118,13 +118,15 @@ def merge_readme_file(solotions_output_path, readme_head_path, readme_catalogue_
# 生成 Contents/index.md 文件
content_index_file = open(content_index_path, 'w')
content_index_file.writelines("# 算法通关手册(LeetCode)\n\n")
content_index_file.writelines("## 章节目录\n\n")

# 将章节目录写入 Contents/index.md 文件中
readme_catelogue_list_file = open(readme_catalogue_list_path)
catalogue_list_lines = readme_catelogue_list_file.readlines()
for catalogue_list_line in catalogue_list_lines:
catalogue_list_line = catalogue_list_line.replace('https://github.com/itcharge/LeetCode-Py/blob/main/Contents', '.')
content_index_file.write(catalogue_list_line)

readme_catelogue_list_file.close()
content_index_file.close()

Expand Down
14 changes: 7 additions & 7 deletions Contents/00.Introduction/01.Data-Structures-Algorithms.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
![](https://qcdn.itcharge.cn/images/202109092112373.png)
![程序=算法+数据结构](https://qcdn.itcharge.cn/images/202109092112373.png)

> 数据结构是程序的骨架,而算法则是程序的灵魂。

Expand Down Expand Up @@ -46,23 +46,23 @@

集合结构中的数据元素是无序的,并且每个数据元素都是唯一的,集合中没有相同的数据元素。集合结构很像数学意义上的「集合」。

![](https://qcdn.itcharge.cn/images/202109092116404.png)
![集合结构](https://qcdn.itcharge.cn/images/20240509150647.png)

#### 2. 线性结构

> **线性结构**:数据元素之间是「一对一」关系。

线性结构中的数据元素(除了第一个和最后一个元素),左侧和右侧分别只有一个数据与其相邻。线性结构类型包括:数组、链表,以及由它们衍生出来的栈、队列、哈希表。

![](https://qcdn.itcharge.cn/images/202109092117492.png)
![线性结构](https://qcdn.itcharge.cn/images/20240509150709.png)

#### 3. 树形结构

> **树形结构**:数据元素之间是「一对多」的层次关系。

最简单的树形结构是二叉树。这种结构可以简单的表示为:根, 左子树, 右子树。 左子树和右子树又有自己的子树。当然除了二叉树,树形结构类型还包括:多叉树、字典树等。

![](https://qcdn.itcharge.cn/images/202109092118089.png)
![树形结构](https://qcdn.itcharge.cn/images/20240509150724.png)

#### 4. 图形结构

Expand All @@ -72,7 +72,7 @@

在图形结构中,任意两个结点之间都可能相关,即结点之间的邻接关系可以是任意的。图形结构类型包括:无向图、有向图、连通图等。

![](https://qcdn.itcharge.cn/images/202109092119090.png)
![图形结构](https://qcdn.itcharge.cn/images/20240509150831.png)

### 1.2 数据的物理结构

Expand All @@ -84,7 +84,7 @@

> **顺序存储结构(Sequential Storage Structure)**:将数据元素存放在一片地址连续的存储单元里,数据元素之间的逻辑关系通过数据元素的存储地址来直接反映。

![](https://qcdn.itcharge.cn/images/202109092121742.png)
![顺序存储结构](https://qcdn.itcharge.cn/images/20240509150846.png)

在顺序存储结构中,逻辑上相邻的数据元素在物理地址上也必然相邻 。

Expand All @@ -94,7 +94,7 @@

> **链式存储结构(Linked Storage Structure)**:将数据元素存放在任意的存储单元里,存储单元可以连续,也可以不连续。

![](https://qcdn.itcharge.cn/images/202109092120553.png)
![链式存储结构](https://qcdn.itcharge.cn/images/20240509150902.png)

链式存储结构中,逻辑上相邻的数据元素在物理地址上可能相邻,可也能不相邻。其在物理地址上的表现是随机的。链式存储结构中,一般将每个数据元素占用的若干单元的组合称为一个链结点。每个链结点不仅要存放一个数据元素的数据信息,还要存放一个指出这个数据元素在逻辑关系的直接后继元素所在链结点的地址,该地址被称为指针。换句话说,数据元素之间的逻辑关系是通过指针来间接反映的。

Expand Down
8 changes: 4 additions & 4 deletions Contents/00.Introduction/02.Algorithm-Complexity.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ def algorithm(n):
return fact
```

把上述算法中所有语句的执行次数加起来 $1 + n + n + 1 = 2n + 2$,可以用一个函数 $f(n)$ 来表达语句的执行次数:$f(n) = 2n + 2$。
把上述算法中所有语句的执行次数加起来 $1 + n + n + 1 = 2 \times n + 2$,可以用一个函数 $f(n)$ 来表达语句的执行次数:$f(n) = 2 \times n + 2$。

则时间复杂度的函数可以表示为:$T(n) = O(f(n))$。它表示的是随着问题规模 n 的增大,算法执行时间的增长趋势跟 $f(n)$ 相同。$O$ 是一种渐进符号,$T(n)$ 称作算法的 **渐进时间复杂度(Asymptotic Time Complexity)**,简称为 **时间复杂度**。

Expand Down Expand Up @@ -81,7 +81,7 @@ $\Theta$ 符号渐进地给出了一个函数的上界和下界,如果我们

同样,如果我们只知道函数的下界,可以使用 $\Omega$ 渐进下界符号。

![](https://qcdn.itcharge.cn/images/202109092356694.png)
![$\Theta$、$O$ 和 $\Omega$ 记号对比](https://qcdn.itcharge.cn/images/202109092356694.png)

### 2.3 时间复杂度计算

Expand All @@ -101,11 +101,11 @@ $\Theta$ 符号渐进地给出了一个函数的上界和下界,如果我们

- **加法原则**:总的时间复杂度等于量级最大的基本语句的时间复杂度。

如果 $T_1(n) = O(f_1(n))$,$T_2(n) = O(f_2(n))$,$T(n) = T_1(n) + T_2(n)$,则 $T(n) = O(f(n)) = max(O(f_1(n)), O(f_2(n))) = O(max(f_1(n), f_2(n)))$。
如果 $T_1(n) = O(f_1(n))$,$T_2(n) = O(f_2(n))$,$T(n) = T_1(n) + T_2(n)$,则 $T(n) = O(f(n)) = max(O(f_1(n)), \enspace O(f_2(n))) = O(max(f_1(n), \enspace f_2(n)))$。

- **乘法原则**:循环嵌套代码的复杂度等于嵌套内外基本语句的时间复杂度乘积。

如果 $T_1 = O(f_1(n))$,$T_2 = O(f_2(n))$,$T(n) = T_1(n)T_2(n)$,则 $T(n) = O(f(n)) = O(f_1(n))O(f_2(n)) = O(f_1(n)f_2(n))$。
如果 $T_1 = O(f_1(n))$,$T_2 = O(f_2(n))$,$T(n) = T_1(n) \times T_2(n)$,则 $T(n) = O(f(n)) = O(f_1(n)) \times O(f_2(n)) = O(f_1(n) \times f_2(n))$。

下面通过实例来说明如何计算时间复杂度。

Expand Down
18 changes: 9 additions & 9 deletions Contents/00.Introduction/03.LeetCode-Guide.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,37 +16,37 @@ LeetCode 上有 $3000+$ 道的编程问题,支持 $16+$ 种编程语言(C、
2. 输入手机号,获取验证码。
3. 输入验证码之后,点击「登录 / 注册」,就注册好了。

![](https://qcdn.itcharge.cn/images/20210901155409.png)
![LeetCode 注册页面](https://qcdn.itcharge.cn/images/20210901155409.png)

### 2.2 LeetCode 题库

「[题库](https://leetcode.cn/problemset/algorithms/)」是 LeetCode 上最直接的练习入口,在这里可以根据题目的标签、难度、状态进行刷题。也可以按照随机一题开始刷题。

![](https://qcdn.itcharge.cn/images/20210901155423.png)
![LeetCode 题库页面](https://qcdn.itcharge.cn/images/20210901155423.png)

#### 1. 题目标签

LeetCode 的题目涉及了许多算法和数据结构。有贪心,搜索,动态规划,链表,二叉树,哈希表等等,可以通过选择对应标签进行专项刷题,同时也可以看到对应专题的完成度情况。

![](https://qcdn.itcharge.cn/images/20210901155435.png)
![LeetCode 题目标签](https://qcdn.itcharge.cn/images/20210901155435.png)

#### 2. 题目列表

LeetCode 提供了题目的搜索过滤功能。可以筛选相关题单、不同难易程度、题目完成状态、不同标签的题目。还可以根据题目编号、题解数目、通过率、难度、出现频率等进行排序。

![](https://qcdn.itcharge.cn/images/20210901155450.png)
![LeetCode 题目列表](https://qcdn.itcharge.cn/images/20210901155450.png)

#### 3. 当前进度

当前进度提供了一个直观的进度展示。在这里可以看到自己的练习概况。进度会自动展现当前的做题情况。也可以点击「[进度设置](https://leetcode.cn/session/)」创建新的进度,在这里还可以修改、删除相关的进度。

![](https://qcdn.itcharge.cn/images/20210901155500.png)
![LeetCode 当前进度](https://qcdn.itcharge.cn/images/20210901155500.png)

#### 4. 题目详情

从题目大相关题目点击进去,就可以看到这道题目的内容描述和代码编辑器。在这里还可以查看相关的题解和自己的提交记录。

![](https://qcdn.itcharge.cn/images/20210901155529.png)
![LeetCode 题目详情](https://qcdn.itcharge.cn/images/20210901155529.png)

### 2.3 LeetCode 刷题语言

Expand All @@ -62,13 +62,13 @@ LeetCode 提供了题目的搜索过滤功能。可以筛选相关题单、不

在「2.2 LeetCode 题库 —— 4. 题目详情」中我们介绍了题目的相关情况。

![](https://qcdn.itcharge.cn/images/20210901155529.png)
![LeetCode 题目详情](https://qcdn.itcharge.cn/images/20210901155529.png)

可以看到左侧区域为题目内容描述区域,在这里可以看到题目的内容描述和一些示例数据。而右侧是代码编辑区域,代码编辑区域里边默认显示了待实现的方法。

我们需要在代码编辑器中根据方法给定的参数实现对应的算法,并返回题目要求的结果。然后还要经过「执行代码」测试结果,点击「提交」后,显示执行结果为「**通过**」时,才算完成一道题目。

![](https://qcdn.itcharge.cn/images/20210901155545.png)
![LeetCode 提交记录](https://qcdn.itcharge.cn/images/20210901155545.png)

总结一下我们的刷题流程为:

Expand Down Expand Up @@ -146,7 +146,7 @@ class Solution:

##### 思路 2:哈希表

哈希表中键值对信息为 $target-nums[i] :i,其中 $i$ 为下标。
哈希表中键值对信息为 $target - nums[i]: i$,其中 $i$ 为下标。

1. 遍历数组,对于每一个数 $nums[i]$:
1. 先查找字典中是否存在 $target - nums[i]$,存在则输出 $target - nums[i]$ 对应的下标和当前数组的下标 $i$。
Expand Down
Loading