第六章 图

一、图的基本概念(选择高频,基础必背)

1. 图的定义

图是由顶点集和边集组成的非线性结构,其中:

  • 顶点集:顶点的有限集合,顶点无重复,不能为空(至少1个顶点);

  • 边集:边的有限集合,边是顶点之间的关联关系,可空(空图)。

2. 图的分类

(1)按边的方向分类

  • 无向图:边无方向,两个顶点之间的边没有先后顺序,边的两个顶点互为邻接点;

  • 有向图:边有方向,分为弧尾和弧头,从弧尾指向弧头,两个顶点之间的双向边视为两条不同的有向边。

(2)按边的数量分类

  • 稀疏图:边的数量远少于完全图的边数;

  • 稠密图:边的数量接近完全图的边数;

  • 完全图:任意两个顶点之间都有边相连。

  • 无向完全图:边的数量等于顶点数乘以(顶点数减一)再除以二;

  • 有向完全图:边的数量等于顶点数乘以(顶点数减一)(每个顶点到其他所有顶点都有一条有向边)。

(3)其他特殊图

  • 网(带权图):边上带有权值(表示距离、代价等)的图,分为无向网和有向网;

  • 有向无环图:无环的有向图,是拓扑排序、关键路径的前提;

  • 子图:从原图中选取部分顶点和边组成的图(顶点集是原图子集,边集是原图中对应顶点的边的子集);

  • 生成子图:包含原图所有顶点的子图;

  • 生成树:属于生成子图的一种,是连通图的极小连通子图,包含原图所有顶点,且边数最少(顶点数减一条),任意添加一条边都会形成环;

  • 森林:由多个互不连通的生成树组成,非连通无向图的每个连通分量都对应一棵生成树,整体构成森林。

3. 顶点的度(核心概念,计算题常考)

(1)无向图:顶点的度是与该顶点关联的边的数量(环算2度);

(2)有向图:顶点的度等于入度加上出度;

  • 入度:以该顶点为弧头的边的数量;

  • 出度:以该顶点为弧尾的边的数量;

(3)握手定理(必考结论):所有顶点的度数之和等于边数的2倍(无向图、有向图均适用),可用于判断图的合法性。

4. 连通性相关概念(选择高频,易混淆)

(1)无向图的连通性

  • 连通:两个顶点之间存在一条路径;

  • 连通图:图中任意两个顶点都连通;

  • 连通分量:无向图中极大的连通子图("极大"指不能再添加原图的顶点使其仍连通);非连通无向图有多个连通分量;

  • 极小连通子图:包含原图所有顶点,且边数最少的连通子图,也就是生成树,移除任意一条边都会导致图不连通。

(2)有向图的连通性

  • 强连通:两个顶点之间,既存在从第一个顶点到第二个顶点的路径,也存在从第二个顶点到第一个顶点的路径;

  • 强连通图:图中任意两个顶点都强连通;

  • 强连通分量:有向图中极大的强连通子图;即使是强连通图,其强连通分量也只有自身;

  • 弱连通图:将有向图的所有有向边改为无向边后,图是连通的,则称该有向图为弱连通图。

5. 路径与环(易混淆,选择常考)

  • 路径:从一个顶点到另一个顶点的顶点序列(或边序列);

  • 简单路径:路径中所有顶点不重复;

  • 回路(环):起点和终点相同的路径;

  • 简单回路:起点和终点相同,其余顶点不重复的回路;

  • 路径长度:无向图中为边的数量,有向网中为边上权值之和;

  • 最短路径:两个顶点之间,路径长度最小的路径(无权图中边数最少,带权图中权值之和最小)。

6. 常考结论(选择必背,直接秒杀题目)

  1. 含有n个顶点的无向连通图,至少有n减1条边(生成树的边数);若边数少于n减1,必为非连通图;

  2. 含有n个顶点的无向图,最多有n乘以(n减1)再除以2条边(无向完全图);

  3. 有向图存在拓扑排序,说明该图是有向无环图,也说明图中无环;反之,有环的有向图不存在拓扑排序;

  4. 生成树是连通图的极小连通子图(含所有顶点,边数最少,加任意一条边必成环);

  5. 无向图的邻接矩阵一定对称,有向图的邻接矩阵不一定对称;

  6. 无向图中,连通分量的个数加上边数,大于或等于顶点数;

  7. 有向无环图的拓扑排序结果不唯一,只要符合顶点间的先后约束即可;

  8. 生成树中没有环,且任意两个顶点之间只有一条简单路径。

二、图的存储结构(基础,算法实现的前提)

核心要求:掌握每种存储结构的实现逻辑、优缺点、适用场景,能区分稀疏图和稠密图的存储选择。

1. 邻接矩阵(数组存储,必考)

(1)实现方式:用n行n列的二维数组表示,其中数组中对应位置元素的含义:

  • 无向图:数组对应位置为1表示两个顶点之间存在边,为0表示无边;若为无向网,数组对应位置存储边的权值,无边时设为无穷大;

  • 有向图:数组对应位置为1表示存在从第一个顶点到第二个顶点的弧,为0表示无弧;有向网同理,无边时设为无穷大;

  • 数组对角线元素均为0(无自环,考研默认无自环)。

(2)优缺点

  • 优点:查询任意两条顶点间是否有边(查边)效率高,时间复杂度为常数级;容易实现图的遍历、判断连通性;

  • 缺点:空间复杂度为顶点数的平方,浪费空间(尤其稀疏图,大部分元素为0或无穷大);添加/删除边需修改对应数组元素,效率尚可,但添加顶点需重构数组,效率低。

(3)适用场景:稠密图、需要频繁查边的场景。

2. 邻接表(链表+数组,必考)

(1)实现方式:由"顶点数组"和"邻接链表"组成:

  • 顶点数组:数组的每个元素存储一个顶点的信息(如顶点编号、数据),数组下标对应顶点编号,方便快速查找顶点;

  • 邻接链表:每个顶点对应一条链表,链表中的每个节点存储与该顶点相邻的顶点信息(如相邻顶点编号、边的权值),以及指向下一个相邻顶点的指针。

补充说明:无向图的邻接表中,同一条边会在两个相邻顶点的链表中各出现一次(比如顶点A和顶点B之间的边,会在A的链表中出现B,在B的链表中出现A);有向图的邻接表中,每条弧只在弧尾顶点的链表中出现一次(比如从A指向B的弧,只在A的链表中出现B)。

(2)优缺点

  • 优点:空间复杂度为顶点数加边数,节省空间(尤其稀疏图,边数少,无需存储大量无效数据);添加/删除边只需修改对应链表,效率高;添加顶点只需在数组末尾添加元素,效率高;遍历图时,只需遍历所有顶点的邻接链表,效率高。

  • 缺点:查询任意两条顶点间是否有边(查边)效率低,需要遍历对应顶点的邻接链表,时间复杂度与该顶点的度数相关;不适合频繁查边的场景。

(3)适用场景:稀疏图、需要频繁添加/删除顶点和边、需要频繁遍历图的场景。

3. 十字链表(有向图专用,了解即可)

(1)实现方式:专为有向图设计,解决邻接表查询入边不便的问题,由"顶点数组"和"弧节点"组成:

  • 顶点数组:每个顶点存储两个指针,一个指向以该顶点为弧尾的第一条弧,一个指向以该顶点为弧头的第一条弧;

  • 弧节点:每个弧节点存储弧尾、弧头、权值,以及两个指针(一个指向同弧尾的下一条弧,一个指向同弧头的下一条弧)。

(2)优缺点

  • 优点:查询一个顶点的入边和出边都很方便,适合需要频繁查询入边的有向图操作;

  • 缺点:结构复杂,实现难度大,考研仅需了解结构逻辑,不考手写实现。

(3)适用场景:有向图,且需要频繁查询入边和出边的场景(考研几乎不考应用)。

4. 邻接多重表(无向图专用,了解即可)

(1)实现方式:专为无向图设计,解决邻接表中同一条边重复存储的问题,由"顶点数组"和"边节点"组成:

  • 顶点数组:每个顶点存储一个指针,指向与该顶点关联的第一条边;

  • 边节点:每个边节点存储两个关联的顶点、权值,以及两个指针(分别指向与两个顶点关联的下一条边),一条边只对应一个边节点。

(2)优缺点

  • 优点:避免边的重复存储,节省空间;删除边时只需修改一个边节点,效率高;

  • 缺点:结构比邻接表复杂,实现难度大,考研仅需了解结构逻辑,不考手写实现。

(3)适用场景:无向图,且需要频繁删除边的场景(考研几乎不考应用)。

三、图的遍历(必考,算法基础)

核心要求:掌握两种遍历的实现思路、步骤、适用场景,牢记时间复杂度,能区分两种遍历的差异,适配大题手写步骤。

图的遍历:从图中某个顶点出发,按照一定的顺序访问图中所有顶点,且每个顶点只访问一次的过程,是后续所有图算法(最短路径、拓扑排序等)的基础。

1. 深度优先搜索(DFS,必考)

(1)核心思想:从起始顶点出发,沿着一条路径一直走到底(尽可能深地访问),直到无法继续前进(没有未访问的邻接点),再回溯到上一个顶点,继续访问其他未访问的邻接点,直到所有顶点都被访问。

(2)实现方式:两种方式均可,考研大题可任选一种,推荐递归(代码更简洁)。

  • 递归实现:借助函数递归的回溯特性,访问一个顶点后,递归访问其所有未访问的邻接点;

  • 栈实现:用栈存储待访问的顶点,访问一个顶点后,将其未访问的邻接点依次压入栈,再从栈顶取出顶点继续访问,直到栈为空。

(3)遍历特点:遍历顺序不唯一(取决于邻接点的访问顺序),类似树的先序遍历(先访问根节点,再递归访问子树)。

(4)时间复杂度:与存储结构相关,无关图的稠密程度。

  • 邻接矩阵存储:时间复杂度为顶点数的平方(需要遍历每个顶点,每个顶点需要遍历所有其他顶点判断是否有边);

  • 邻接表存储:时间复杂度为顶点数加边数(需要遍历每个顶点,每个边会被访问两次,无向图)或一次(有向图)。

(5)应用场景:判断图的连通性(遍历结束后,若所有顶点都被访问,则图连通);查找图中的路径;检测图中是否有环;拓扑排序的辅助实现。

2. 广度优先搜索(BFS,必考)

(1)核心思想:从起始顶点出发,先访问该顶点的所有未访问的邻接点(一层一层地访问),再依次访问每个邻接点的未访问邻接点,直到所有顶点都被访问,类似"逐层扩散"。

(2)实现方式:只能用队列实现,步骤固定。

  • 步骤:将起始顶点入队,标记为已访问;然后出队,访问该顶点的所有未访问邻接点,标记为已访问并入队;重复出队、访问邻接点、入队的操作,直到队列为空。

(3)遍历特点:遍历顺序不唯一(取决于邻接点的访问顺序),类似树的层序遍历(逐层访问节点);无权图中,用BFS遍历得到的路径是起始顶点到其他顶点的最短路径(边数最少)。

(4)时间复杂度:与深度优先搜索一致,与存储结构相关。

  • 邻接矩阵存储:时间复杂度为顶点数的平方;

  • 邻接表存储:时间复杂度为顶点数加边数。

(5)应用场景:判断图的连通性;求无权图的单源最短路径(起始顶点到其他所有顶点的最短路径);分层访问图中的顶点。

3. 遍历相关注意事项(考研易错点)

  • 无论DFS还是BFS,都需要设置"访问标记"(如数组),避免重复访问顶点;

  • 非连通图的遍历:需要遍历所有顶点,若某个顶点未被访问,则从该顶点开始重新遍历,直到所有顶点都被访问;

  • 有向图的遍历:由于边有方向,可能存在某些顶点无法被访问(即使图是弱连通的),需注意起始顶点的选择。

四、最小生成树(MST,大题高频)

核心要求:掌握两种算法的核心思想、步骤、适用场景,牢记时间复杂度,能手写大题步骤(如 Prim 算法的分步计算、Kruskal 算法的边选择过程)。

最小生成树定义:针对连通网(带权的连通图),生成树中所有边的权值之和最小的生成树,称为最小生成树。最小生成树不唯一,但权值之和一定是最小的;若连通网中所有边的权值都不相同,则最小生成树唯一。

核心性质:生成树有顶点数减一条边,且无环;最小生成树是连通网的极小连通子图,且权值之和最小。

1. Prim 算法(必考)

(1)核心思想:从一个任意选定的起始顶点出发,每次选择"已访问顶点集合"和"未访问顶点集合"之间权值最小的边,将该边对应的未访问顶点加入已访问集合,重复该过程,直到所有顶点都加入已访问集合,此时所有选中的边组成最小生成树。

简单理解:"从点出发",逐步扩大已访问顶点的范围,每次选最短的连接边。

(2)实现步骤(简化版,适配大题手写)

  1. 任选一个起始顶点,标记为已访问,记录每个未访问顶点到已访问集合的最小边权;

  2. 从所有未访问顶点中,选择到已访问集合边权最小的顶点,标记为已访问,将对应的边加入最小生成树;

  3. 更新剩余未访问顶点到已访问集合的最小边权(若新加入的顶点与某个未访问顶点的边权,小于当前记录的最小边权,则更新);

  4. 重复步骤2和步骤3,直到所有顶点都被标记为已访问(共执行顶点数减一次,选中顶点数减一条边)。

(3)时间复杂度:主要取决于"查找最小边权"的效率,与存储结构相关。

  • 邻接矩阵存储:时间复杂度为顶点数的平方(每次查找最小边权需要遍历所有未访问顶点);

  • 邻接表存储:时间复杂度为边数乘以边数的对数(需借助堆优化查找最小边权)。

(4)适用场景:稠密网(边数多,顶点数少),因为邻接矩阵存储时效率更高,无需额外优化。

2. Kruskal 算法(必考)

(1)核心思想:将连通网中所有的边按权值从小到大排序,然后依次从权值最小的边开始选择,若该边连接的两个顶点不在同一个连通分量中(避免形成环),则将该边加入最小生成树,重复该过程,直到选中顶点数减一条边,此时所有选中的边组成最小生成树。

简单理解:"从边出发",先选最短的边,避开环,直到连接所有顶点。

(2)关键辅助工具:并查集(用于判断两个顶点是否在同一个连通分量,避免形成环),考研需掌握并查集的基本操作(查找、合并)。

(3)实现步骤(简化版,适配大题手写)

  1. 将连通网中所有边按权值从小到大排序;

  2. 初始化并查集(每个顶点各自成为一个独立的连通分量);

  3. 依次遍历排序后的边,对于每条边,判断其连接的两个顶点是否在同一个连通分量中;

  4. 若不在同一个连通分量,将该边加入最小生成树,并用并查集合并两个顶点所在的连通分量;

  5. 重复步骤3和步骤4,直到选中顶点数减一条边(此时所有顶点都在同一个连通分量中)。

(4)时间复杂度:主要取决于边的排序,时间复杂度为边数乘以边数的对数(排序的时间),与顶点数无关。

(5)适用场景:稀疏网(边数少,顶点数多),因为排序的边数少,效率更高。

3. 两种算法对比(选择常考)

  • 核心区别:Prim算法从顶点出发,逐步扩大连通范围;Kruskal算法从边出发,逐步合并连通分量;

  • 时间复杂度:Prim算法适合稠密网,Kruskal算法适合稀疏网;

  • 环的避免:Prim算法天然不会形成环(只选已访问和未访问顶点之间的边);Kruskal算法需借助并查集避免环。

五、最短路径(必考,大题高频)

核心要求:掌握三种算法的核心思想、适用场景、时间复杂度,能手写Dijkstra算法和Floyd算法的大题步骤,明确每种算法的限制条件。

最短路径定义:从一个顶点(源点)到另一个顶点(终点)的路径中,权值之和最小的路径,分为单源最短路径(从一个源点到其他所有顶点)和多源最短路径(从所有顶点到其他所有顶点)。

1. Dijkstra 算法(单源最短路径,必考)

(1)核心思想:贪心算法,从源点出发,每次选择当前距离源点最近的未访问顶点,标记为已访问,然后更新该顶点的所有邻接点到源点的距离(若经过该顶点到邻接点的距离,小于当前记录的邻接点到源点的距离,则更新),重复该过程,直到所有顶点都被访问。

(2)限制条件:不支持负权边(若存在负权边,会导致已标记为"最短距离"的顶点,被后续负权边更新,导致算法出错)。

(3)实现步骤(简化版,适配大题手写)

  1. 初始化距离数组:源点到自身的距离为0,源点到其他所有顶点的距离设为无穷大;标记所有顶点为未访问;

  2. 从所有未访问顶点中,选择距离源点最近的顶点,标记为已访问;

  3. 遍历该顶点的所有邻接点,计算源点经过该顶点到邻接点的距离(源点到该顶点的距离 + 该顶点到邻接点的边权);

  4. 若计算出的距离小于邻接点当前的距离,则更新邻接点的距离;

  5. 重复步骤2到步骤4,直到所有顶点都被标记为已访问,此时距离数组中存储的就是源点到各顶点的最短距离。

(4)时间复杂度:与存储结构和优化方式相关。

  • 邻接矩阵存储(未优化):时间复杂度为顶点数的平方;

  • 邻接表存储(堆优化):时间复杂度为边数乘以边数的对数。

(5)适用场景:无负权边的连通网,求单源最短路径(如从某个顶点出发,求到其他所有顶点的最短距离)。

2. Floyd 算法(多源最短路径,必考)

(1)核心思想:动态规划思想,通过中间顶点逐步优化任意两个顶点之间的最短距离,即"对于任意两个顶点,若经过某个中间顶点的路径距离更短,则更新这两个顶点之间的最短距离",重复该过程,直到所有中间顶点都被考虑。

简单理解:枚举所有中间顶点,逐步更新任意两个顶点之间的最短距离。

(2)限制条件:支持负权边,但不支持负权回路(若存在负权回路,会导致两个顶点之间的距离无限减小,算法无法终止)。

(3)实现步骤(简化版,适配大题手写)

  1. 初始化距离矩阵:距离矩阵中对应位置存储两个顶点之间的直接边权,无边时设为无穷大,顶点到自身的距离为0;

  2. 枚举所有中间顶点,对于每个中间顶点,枚举所有起点和终点;

  3. 对于每个起点和终点,判断"起点到中间顶点的距离 + 中间顶点到终点的距离"是否小于"起点到终点的直接距离";

  4. 若小于,则更新起点到终点的距离;

  5. 所有中间顶点枚举完毕后,距离矩阵中存储的就是任意两个顶点之间的最短距离。

(4)时间复杂度:固定为顶点数的立方,与边数无关,因为需要三重循环(枚举中间顶点、起点、终点)。

(5)适用场景:任意连通网(无负权回路),求多源最短路径(如求所有顶点之间的最短距离),尤其适合顶点数较少的场景(顶点数多会导致时间复杂度过高)。

3. Bellman-Ford 算法(单源最短路径,了解即可)

(1)核心思想:通过反复松弛边(更新顶点到源点的距离),逐步得到源点到其他所有顶点的最短距离,最多需要松弛顶点数减一次(因为最长的简单路径最多有顶点数减一条边)。

(2)优势:可处理负权边,还能检测负权回路(若经过顶点数减一次松弛后,仍能更新某个顶点的距离,则说明存在负权回路)。

(3)时间复杂度:时间复杂度为顶点数乘以边数,效率低于Dijkstra算法和Floyd算法。

(4)适用场景:有负权边,且需要检测负权回路的单源最短路径问题(考研考得少,主要掌握其能处理负权边、检测负权回路的特点)。

4. 三种算法对比(选择常考)

  • 适用场景:Dijkstra算法(无负权边,单源)、Floyd算法(无负权回路,多源)、Bellman-Ford算法(负权边,单源,检测负权回路);

  • 时间复杂度:Floyd算法(顶点数立方)> Bellman-Ford算法(顶点数×边数)> Dijkstra算法(堆优化,边数×log边数);

  • 负权支持:Bellman-Ford算法支持负权边,Floyd算法支持负权边但不支持负权回路,Dijkstra算法不支持负权边。

六、拓扑排序(DAG专属,必考)

核心要求:掌握拓扑排序的核心思想、步骤、适用场景,能手写拓扑排序的步骤,明确其与有向无环图的关系。

拓扑排序定义:对有向无环图中的所有顶点,按照"前驱顶点先于后继顶点"的顺序进行排列,得到的顶点序列称为拓扑序列,拓扑排序就是求拓扑序列的过程。

核心前提:只有有向无环图才有拓扑排序,有环的有向图不存在拓扑排序(因为环中的顶点之间互为前驱和后继,无法确定先后顺序)。

1. 核心思想

不断选择入度为0的顶点(没有前驱顶点,可优先访问),将其输出到拓扑序列中,然后删除该顶点的所有出边(即减少其邻接点的入度),重复该过程,直到所有顶点都被输出(得到完整拓扑序列),或没有入度为0的顶点(说明图中有环,无法进行拓扑排序)。

2. 实现步骤(简化版,适配大题手写)

  1. 计算图中所有顶点的入度,记录在入度数组中;

  2. 初始化队列,将所有入度为0的顶点入队;

  3. 当队列不为空时,执行以下操作:

a. 出队一个顶点,将其加入拓扑序列;

b. 遍历该顶点的所有出边,找到其每个邻接点,将邻接点的入度减1;

c. 若某个邻接点的入度减为0,则将其入队;

  1. 遍历结束后,若拓扑序列中顶点的个数等于图中顶点的总数,则说明图是有向无环图,得到拓扑序列;若小于,则说明图中有环,无拓扑序列。

3. 时间复杂度

与图的存储结构相关,邻接矩阵存储时为顶点数的平方,邻接表存储时为顶点数加边数,与图的遍历时间复杂度一致。

4. 特点与应用场景

  • 特点:拓扑序列不唯一(若有多个入度为0的顶点,可任意选择一个入队,导致序列不同);

  • 应用场景:判断有向图是否有环;处理具有先后约束的任务调度(如工程施工,某些任务必须在其他任务完成后才能进行)。

七、关键路径(AOE网专属,大题低频,了解重点)

核心要求:掌握关键路径的定义、核心概念,能计算关键活动,了解关键路径的意义,无需深入手写复杂步骤(考研大题考得少,重点在选择)。

  1. 相关定义
  • AOE网:边表示活动,顶点表示事件(如"某个活动开始""某个活动结束"),边上的权值表示活动的持续时间,是一个带权的有向无环图;

  • 关键路径:从起点(开始事件)到终点(结束事件)的路径中,权值之和最大的路径,决定了工程的最短完成时间(因为关键路径上的活动全部完成,工程才能结束);

  • 关键活动:关键路径上的活动,若关键活动延迟完成,整个工程会延迟;若关键活动提前完成,整个工程可提前完成。

  1. 核心计算(4个关键量,选择常考)
  • 事件最早发生时间:从起点到该事件的最长路径长度(因为只有所有前置活动都完成,事件才能发生,取最长路径确保所有前置活动都完成);

  • 事件最晚发生时间:从终点到该事件的最长路径长度,减去该事件到终点的最长路径长度(确保不影响工程的最短完成时间);

  • 活动最早开始时间:该活动对应的起点事件的最早发生时间(事件发生后,活动才能开始);

  • 活动最晚开始时间:该活动对应的终点事件的最晚发生时间,减去该活动的持续时间(确保活动完成后,不影响后续事件的最晚发生时间)。

  1. 关键活动的判断

活动最早开始时间等于活动最晚开始时间,说明该活动是关键活动(没有缓冲时间,延迟会影响工程进度);反之,不是关键活动(有缓冲时间,轻微延迟不影响工程进度)。

  1. 特点与应用场景
  • 特点:关键路径不唯一,若有多条关键路径,所有关键路径上的关键活动都必须按时完成,工程才能按时结束;

  • 应用场景:工程进度规划,确定工程的最短完成时间,找出关键活动,优先保障关键活动的资源供应。

八、考研易错点与高频陷阱(选择必背)

  1. 混淆"连通图"与"强连通图":无向图谈连通,有向图谈强连通,弱连通图≠强连通图;

  2. 最小生成树的误区:最小生成树的权值之和最小,但边的数量一定是顶点数减一条,且无环;

  3. Dijkstra算法的限制:不能处理负权边,若有负权边,需用Bellman-Ford算法;

  4. 拓扑排序的前提:只有有向无环图才有拓扑排序,有环图无拓扑排序;

  5. 邻接矩阵与邻接表的适用场景:稠密图用邻接矩阵,稀疏图用邻接表;

  6. 握手定理的应用:所有顶点度数之和必为偶数,可用于判断图的合法性(如度数之和为奇数,必为非法图);

  7. 关键路径的误区:关键路径是权值之和最大的路径,不是最小的路径,决定工程最短完成时间。

相关推荐
春栀怡铃声2 小时前
常考排序的梳理
数据结构·算法·排序算法
切糕师学AI3 小时前
Elasticsearch 深度解析:从核心原理到开发者实战
大数据·elasticsearch·搜索引擎·分布式搜索分析引擎
csuzhucong3 小时前
puzzle(1052)仙人指路
算法
会飞的老朱3 小时前
AI+OA协同办公,重构办公模式,加速企业数字化转型!
大数据·oa协同办公·智能办公平台
XiYang-DING3 小时前
【LeetCode】链表 + 快慢指针找中间 + 反转链表 | 2130. 链表最大孪生和
算法·leetcode·链表
Charlie_lll3 小时前
力扣解题-67. 二进制求和
算法·leetcode·职场和发展
Yzzz-F3 小时前
GYM106247B[数论 构造一个数字和因子 使得等于n个因子之和=数字]
算法
CyberMuse3 小时前
欧拉公式(Euler‘s Formula)在信号系统中的应用
算法
吕司4 小时前
LeetCode Hot Code —— 和为K的子数组
数据结构·算法·leetcode