第二讲 数据结构 并查集是一种简单而高效的数据结构,特别适用于一些需要频繁合并和查找操作的场景。通过路径压缩和按秩合并的优化,可以在近乎常数时间内处理动态连通性问题。不论是在图论问题、网络连通性检测还是其他需要判定等价关系的领域,并查集都显示出其强大的优势。!int n,m;int p[N];//数组 `p` 是并查集的父指针数组,`p[i]` 表示元素 `i` 的直接父节点。if(p[x]!//(带路径压缩)int main()i<=n;while(m--)
代码随想录算法训练营第75天:总结篇[1] 题,后面决定加入训练营与大家齐头并进,刚开始气氛很好,我也是因为前面基础篇都是二三刷,自己也有思路去总结博客,到后面难度上来了,我就只能去理解文章题意,疏通明白后手敲代码一遍,把网站上的内容粘到博客上,当然这只是开始,我想说我还是会在接下来的时间去深入学习的,我遇到的比较难的几个点,一个应该是二叉树的时期,简直太多了,当时也搞不懂,但是还是跌跌撞撞的坚持下来,大家写算法其实没必要要求一下子全部都掌握,我就是保持进。
代码随想录算法训练营第74天:路径总结[1] 至此已经讲解了四大最短路算法,分别是Dijkstra、Bellman_ford、SPFA 和 Floyd。dijkstra朴素版dijkstra堆优化版Bellman_ford 队列优化算法(又名SPFA)bellman_ford 算法判断负权回路bellman_ford之单源有限最短路Floyd 算法精讲启发式搜索:A * 算法最短路算法比较复杂,而且各自有各自的应用场景,我来用一张表把讲过的最短路算法的使用场景都展现出来:。
代码随想录算法训练营第71天:路径算法[1] 本题是单源有限最短路问题,也是 bellman_ford的一个拓展问题,如果理解bellman_ford 其实思路比较容易理解,但有很多细节。例如 为什么要用 minDist_copy 来记录上一轮 松弛的结果。这也是本篇我为什么花了这么大篇幅讲解的关键所在。边的顺序的影响本题的本质SPFA的解法能否用dijkstra学透了以上四个拓展,相信大家会对bellman_ford有更深入的理解。
代码随想录算法训练营第71天:路径算法[1] Bellman_ford 是可以计算 负权值的单源最短路算法。其算法核心思路是对 所有边进行 n-1 次 松弛。弄清楚 什么是 松弛?为什么要 n-1 次?对理解Bellman_ford 非常重要。
代码随想录算法训练营第70天图论9[1] 本篇,我们深入讲解的dijkstra算法,详细模拟其工作的流程。这里我给出了dijkstra 三部曲 来 帮助大家理解 该算法,不至于 每次写 dijkstra 都是黑盒操作,没有框架没有章法。在给出的代码中,我也按照三部曲的逻辑来给大家注释,只要理解这三部曲,即使 过段时间 对 dijkstra 算法有些遗忘,依然可以写出一个框架出来,然后再去调试细节。对于图论算法,一般代码都比较长,很难写出代码直接可以提交通过,都需要一个debug的过程,所以学习如何debug 非常重要!
代码随想录算法训练营第69天:图论7[1] 最后我们就生成了一个 最小生成树, 绿色的边将所有节点链接到一起,并且 保证权值是最小的,因为我们在更新 minDist 数组的时候,都是选距离 最小生成树最近的点 加入到树中。讲解上面的模拟过程的时候,我已经强调多次 minDist数组 是记录了 所有非生成树节点距离生成树的最小距离。最后,minDist数组 也就是记录的是最小生成树所有边的权值。
代码随想录算法训练营第68天:图论6[1] 本篇我们讲解了并查集的背景、原理、两种优化方式(路径压缩,按秩合并),代码模板,常见误区,以及模拟过程。要知道并查集解决什么问题,在什么场景下我们要想到使用并查集。接下来进一步优化并查集的执行效率,重点介绍了路径压缩的方式,另一种方法:按秩合并,我们在 「拓展」中讲解。通过一步一步的原理讲解,最后给出并查集的模板,所有的并查集题目都在这个模板的基础上进行操作或者适当修改。但只给出模板还是不够的,针对大家学习并查集的常见误区,详细讲解了模板代码的细节。
代码随想录算法训练营第66天:图论4[1] 题目描述:现有一个 N × M 的矩阵,每个单元格包含一个数值,这个数值代表该位置的相对高度。矩阵的左边界和上边界被认为是第一组边界,而矩阵的右边界和下边界被视为第二组边界。矩阵模拟了一个地形,当雨水落在上面时,水会根据地形的倾斜向低处流动,但只能从较高或等高的地点流向较低或等高并且相邻(上下左右方向)的地点。我们的目标是确定那些单元格,从这些单元格出发的水可以达到第一组边界和第二组边界。输入描述:第一行包含两个整数 N 和 M,分别表示矩阵的行数和列数。
代码随想录算法训练营第64天:图论2[1] 当然广搜还有很多细节需要注意的地方,后面我会针对广搜的题目还做针对性的讲解。因为在理论篇讲太多细节,可能会让刚学广搜的录友们越看越懵,所以细节方面针对具体题目在做讲解。本篇我们重点讲解了广搜的使用场景,广搜的过程以及广搜的代码框架。其实在二叉树章节的层序遍历**** 中,我们也讲过一次广搜,相当于是广搜在二叉树这种数据结构上的应用。这次则从图论的角度上再详细讲解一次广度优先遍历。相信看完本篇,大家会对广搜有一个基础性的认识,后面再来做对应的题目就会得心应手一些。
代码随想录算法训练营第63天:图论[1] 以上知识点 大家先有个印象,上面提到的每个知识点,其实都需要大篇幅才能讲明白的。我这里先给大家做一个概括,后面章节会针对每个知识点都会有对应的算法题和针对性的讲解,大家再去深入学习。图论是非常庞大的知识体系,上面的内容还不足以概括图论内容,仅仅是理论基础而已。在图论章节我会带大家深入讲解 深度优先搜索(DFS)、广度优先搜索(BFS)、并查集、拓扑排序、最小生成树系列、最短路算法系列等等。敬请期待!我们讲解了,dfs 和 bfs的大体区别(bfs详细过程下篇来讲),dfs的搜索过程以及代码框架。
代码随想录算法训练营第62天:单调栈进阶[1] 力扣题目链接(opens new window)给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。示例 1:示例 2:《代码随想录》算法视频公开课 ****(opens new window)**** :单调栈,经典来袭!LeetCode:42.接雨水 ****(opens new window)**** ,相信结合视频在看本篇题解,更有助于大家对本题的理解。接雨水问题在面试中还是常见题目的,有必要好好讲一讲。本文深度讲解如下三种方法:本题暴力解法
代码随想录算法训练营第62天:单调栈[1] 题目说如果不存在对应位置就输出 -1 ,所以result数组如果某位置没有被赋值,那么就应该是是-1,所以就初始化为-1。在遍历nums2的过程中,我们要判断nums2[i]是否在nums1中出现过,因为最后是要根据nums1元素的下标来更新result数组。
代码随想录算法训练营第60天:动态and[1] 本周我们讲了动态规划之终极绝杀:编辑距离,为什么叫做终极绝杀呢?细心的录友应该知道,我们在前三篇动态规划的文章就一直为 编辑距离 这道题目做铺垫。心思的录友应该会发现我用了三道题做铺垫,才最后引出了动态规划:72.编辑距离**** ,Carl的良苦用心呀,你们体会到了嘛!
代码随想录算法训练营第58天:动态[1] 这道题目算是编辑距离的入门题目(毕竟这里只是涉及到减法),也是动态规划解决的经典题型。这一类题都是题目读上去感觉很复杂,模拟一下也发现很复杂,用动规分析完了也感觉很复杂,但是最终代码却很简短。在之前的题目讲解中,我们讲了1143.最长公共子序列**** ,大家会发现 本题和 1143.最长公共子序列 的相似之处。编辑距离的题目最能体现出动规精髓和巧妙之处,大家可以好好体会一下。
代码随想录算法训练营第57天:动态 看到代码大家也可以发现其实就是求两个字符串的最长公共子序列,但如果没有做过1143.最长公共子序列**** ,本题其实还有很有难度的。这是Carl为什么要先讲1143.最长公共子序列**** 再讲本题,大家会发现一个正确的刷题顺序对算法学习是非常重要的!这也是Carl做了很多题目(包括ACM和力扣)才总结出来的规律,大家仔细体会一下哈。贪心算法:最大子序和(opens new window)动规的解法还是很直接的。