From cc3adb0d3975a142f4f0c5851e4a07dc9305b2a0 Mon Sep 17 00:00:00 2001 From: ITCharge Date: Thu, 9 May 2024 15:32:23 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=BA=8F=E8=A8=80=E9=83=A8?= =?UTF-8?q?=E5=88=86=E7=9B=B8=E5=85=B3=E5=9B=BE=E7=89=87=E3=80=81=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E6=A0=87=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../01.Data-Structures-Algorithms.md | 14 +++++++------- .../00.Introduction/02.Algorithm-Complexity.md | 8 ++++---- Contents/00.Introduction/03.LeetCode-Guide.md | 18 +++++++++--------- 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/Contents/00.Introduction/01.Data-Structures-Algorithms.md b/Contents/00.Introduction/01.Data-Structures-Algorithms.md index 2f84fc46..82da3984 100644 --- a/Contents/00.Introduction/01.Data-Structures-Algorithms.md +++ b/Contents/00.Introduction/01.Data-Structures-Algorithms.md @@ -1,4 +1,4 @@ -![](https://qcdn.itcharge.cn/images/202109092112373.png) +![程序=算法+数据结构](https://qcdn.itcharge.cn/images/202109092112373.png) > 数据结构是程序的骨架,而算法则是程序的灵魂。 @@ -46,7 +46,7 @@ 集合结构中的数据元素是无序的,并且每个数据元素都是唯一的,集合中没有相同的数据元素。集合结构很像数学意义上的「集合」。 -![](https://qcdn.itcharge.cn/images/202109092116404.png) +![集合结构](https://qcdn.itcharge.cn/images/20240509150647.png) #### 2. 线性结构 @@ -54,7 +54,7 @@ 线性结构中的数据元素(除了第一个和最后一个元素),左侧和右侧分别只有一个数据与其相邻。线性结构类型包括:数组、链表,以及由它们衍生出来的栈、队列、哈希表。 -![](https://qcdn.itcharge.cn/images/202109092117492.png) +![线性结构](https://qcdn.itcharge.cn/images/20240509150709.png) #### 3. 树形结构 @@ -62,7 +62,7 @@ 最简单的树形结构是二叉树。这种结构可以简单的表示为:根, 左子树, 右子树。 左子树和右子树又有自己的子树。当然除了二叉树,树形结构类型还包括:多叉树、字典树等。 -![](https://qcdn.itcharge.cn/images/202109092118089.png) +![树形结构](https://qcdn.itcharge.cn/images/20240509150724.png) #### 4. 图形结构 @@ -72,7 +72,7 @@ 在图形结构中,任意两个结点之间都可能相关,即结点之间的邻接关系可以是任意的。图形结构类型包括:无向图、有向图、连通图等。 -![](https://qcdn.itcharge.cn/images/202109092119090.png) +![图形结构](https://qcdn.itcharge.cn/images/20240509150831.png) ### 1.2 数据的物理结构 @@ -84,7 +84,7 @@ > **顺序存储结构(Sequential Storage Structure)**:将数据元素存放在一片地址连续的存储单元里,数据元素之间的逻辑关系通过数据元素的存储地址来直接反映。 -![](https://qcdn.itcharge.cn/images/202109092121742.png) +![顺序存储结构](https://qcdn.itcharge.cn/images/20240509150846.png) 在顺序存储结构中,逻辑上相邻的数据元素在物理地址上也必然相邻 。 @@ -94,7 +94,7 @@ > **链式存储结构(Linked Storage Structure)**:将数据元素存放在任意的存储单元里,存储单元可以连续,也可以不连续。 -![](https://qcdn.itcharge.cn/images/202109092120553.png) +![链式存储结构](https://qcdn.itcharge.cn/images/20240509150902.png) 链式存储结构中,逻辑上相邻的数据元素在物理地址上可能相邻,可也能不相邻。其在物理地址上的表现是随机的。链式存储结构中,一般将每个数据元素占用的若干单元的组合称为一个链结点。每个链结点不仅要存放一个数据元素的数据信息,还要存放一个指出这个数据元素在逻辑关系的直接后继元素所在链结点的地址,该地址被称为指针。换句话说,数据元素之间的逻辑关系是通过指针来间接反映的。 diff --git a/Contents/00.Introduction/02.Algorithm-Complexity.md b/Contents/00.Introduction/02.Algorithm-Complexity.md index f672db6b..8d001d38 100644 --- a/Contents/00.Introduction/02.Algorithm-Complexity.md +++ b/Contents/00.Introduction/02.Algorithm-Complexity.md @@ -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)**,简称为 **时间复杂度**。 @@ -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 时间复杂度计算 @@ -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))$。 下面通过实例来说明如何计算时间复杂度。 diff --git a/Contents/00.Introduction/03.LeetCode-Guide.md b/Contents/00.Introduction/03.LeetCode-Guide.md index 74dcf783..01361a11 100644 --- a/Contents/00.Introduction/03.LeetCode-Guide.md +++ b/Contents/00.Introduction/03.LeetCode-Guide.md @@ -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 刷题语言 @@ -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) 总结一下我们的刷题流程为: @@ -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$。