数据结构与算法
文章平均质量分 95
mana飞侠
这个作者很懒,什么都没留下…
展开
-
第二讲 数据结构
并查集是一种简单而高效的数据结构,特别适用于一些需要频繁合并和查找操作的场景。通过路径压缩和按秩合并的优化,可以在近乎常数时间内处理动态连通性问题。不论是在图论问题、网络连通性检测还是其他需要判定等价关系的领域,并查集都显示出其强大的优势。!int n,m;int p[N];//数组 `p` 是并查集的父指针数组,`p[i]` 表示元素 `i` 的直接父节点。if(p[x]!//(带路径压缩)int main()i<=n;while(m--)原创 2024-07-12 21:16:22 · 2849 阅读 · 1 评论 -
第一讲 基础算法
acwing的基础第一章总结原创 2024-07-11 15:32:56 · 526 阅读 · 1 评论 -
代码随想录算法训练营第75天:总结篇[1]
题,后面决定加入训练营与大家齐头并进,刚开始气氛很好,我也是因为前面基础篇都是二三刷,自己也有思路去总结博客,到后面难度上来了,我就只能去理解文章题意,疏通明白后手敲代码一遍,把网站上的内容粘到博客上,当然这只是开始,我想说我还是会在接下来的时间去深入学习的,我遇到的比较难的几个点,一个应该是二叉树的时期,简直太多了,当时也搞不懂,但是还是跌跌撞撞的坚持下来,大家写算法其实没必要要求一下子全部都掌握,我就是保持进。原创 2024-07-05 12:03:09 · 233 阅读 · 0 评论 -
代码随想录算法训练营第74天:路径总结[1]
至此已经讲解了四大最短路算法,分别是Dijkstra、Bellman_ford、SPFA 和 Floyd。dijkstra朴素版dijkstra堆优化版Bellman_ford 队列优化算法(又名SPFA)bellman_ford 算法判断负权回路bellman_ford之单源有限最短路Floyd 算法精讲启发式搜索:A * 算法最短路算法比较复杂,而且各自有各自的应用场景,我来用一张表把讲过的最短路算法的使用场景都展现出来:。原创 2024-07-05 11:46:39 · 1154 阅读 · 0 评论 -
代码随想录算法训练营第71天:路径算法[1]
本题是单源有限最短路问题,也是 bellman_ford的一个拓展问题,如果理解bellman_ford 其实思路比较容易理解,但有很多细节。例如 为什么要用 minDist_copy 来记录上一轮 松弛的结果。这也是本篇我为什么花了这么大篇幅讲解的关键所在。边的顺序的影响本题的本质SPFA的解法能否用dijkstra学透了以上四个拓展,相信大家会对bellman_ford有更深入的理解。原创 2024-07-05 11:44:27 · 1047 阅读 · 0 评论 -
代码随想录算法训练营第71天:路径算法[1]
Bellman_ford 是可以计算 负权值的单源最短路算法。其算法核心思路是对 所有边进行 n-1 次 松弛。弄清楚 什么是 松弛?为什么要 n-1 次?对理解Bellman_ford 非常重要。原创 2024-07-05 11:42:11 · 886 阅读 · 0 评论 -
代码随想录算法训练营第70天图论9[1]
本篇,我们深入讲解的dijkstra算法,详细模拟其工作的流程。这里我给出了dijkstra 三部曲 来 帮助大家理解 该算法,不至于 每次写 dijkstra 都是黑盒操作,没有框架没有章法。在给出的代码中,我也按照三部曲的逻辑来给大家注释,只要理解这三部曲,即使 过段时间 对 dijkstra 算法有些遗忘,依然可以写出一个框架出来,然后再去调试细节。对于图论算法,一般代码都比较长,很难写出代码直接可以提交通过,都需要一个debug的过程,所以学习如何debug 非常重要!原创 2024-07-04 21:17:53 · 522 阅读 · 0 评论 -
代码随想录算法训练营第69天:图论7[1]
最后我们就生成了一个 最小生成树, 绿色的边将所有节点链接到一起,并且 保证权值是最小的,因为我们在更新 minDist 数组的时候,都是选距离 最小生成树最近的点 加入到树中。讲解上面的模拟过程的时候,我已经强调多次 minDist数组 是记录了 所有非生成树节点距离生成树的最小距离。最后,minDist数组 也就是记录的是最小生成树所有边的权值。原创 2024-07-04 21:15:48 · 555 阅读 · 0 评论 -
代码随想录算法训练营第68天:图论6[1]
本篇我们讲解了并查集的背景、原理、两种优化方式(路径压缩,按秩合并),代码模板,常见误区,以及模拟过程。要知道并查集解决什么问题,在什么场景下我们要想到使用并查集。接下来进一步优化并查集的执行效率,重点介绍了路径压缩的方式,另一种方法:按秩合并,我们在 「拓展」中讲解。通过一步一步的原理讲解,最后给出并查集的模板,所有的并查集题目都在这个模板的基础上进行操作或者适当修改。但只给出模板还是不够的,针对大家学习并查集的常见误区,详细讲解了模板代码的细节。原创 2024-07-04 21:13:58 · 477 阅读 · 0 评论 -
代码随想录算法训练营第67天:图论5[1]
。原创 2024-07-04 11:45:44 · 1246 阅读 · 0 评论 -
代码随想录算法训练营第65天:图论3[1]
。原创 2024-07-03 18:02:33 · 828 阅读 · 0 评论 -
代码随想录算法训练营第63天:图论[1]
以上知识点 大家先有个印象,上面提到的每个知识点,其实都需要大篇幅才能讲明白的。我这里先给大家做一个概括,后面章节会针对每个知识点都会有对应的算法题和针对性的讲解,大家再去深入学习。图论是非常庞大的知识体系,上面的内容还不足以概括图论内容,仅仅是理论基础而已。在图论章节我会带大家深入讲解 深度优先搜索(DFS)、广度优先搜索(BFS)、并查集、拓扑排序、最小生成树系列、最短路算法系列等等。敬请期待!我们讲解了,dfs 和 bfs的大体区别(bfs详细过程下篇来讲),dfs的搜索过程以及代码框架。原创 2024-07-03 12:13:30 · 765 阅读 · 0 评论 -
代码随想录算法训练营第62天:单调栈进阶[1]
力扣题目链接(opens new window)给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。示例 1:示例 2:《代码随想录》算法视频公开课 ****(opens new window)**** :单调栈,经典来袭!LeetCode:42.接雨水 ****(opens new window)**** ,相信结合视频在看本篇题解,更有助于大家对本题的理解。接雨水问题在面试中还是常见题目的,有必要好好讲一讲。本文深度讲解如下三种方法:本题暴力解法原创 2024-07-02 17:26:08 · 626 阅读 · 0 评论 -
代码随想录算法训练营第62天:单调栈[1]
题目说如果不存在对应位置就输出 -1 ,所以result数组如果某位置没有被赋值,那么就应该是是-1,所以就初始化为-1。在遍历nums2的过程中,我们要判断nums2[i]是否在nums1中出现过,因为最后是要根据nums1元素的下标来更新result数组。原创 2024-07-02 17:23:40 · 303 阅读 · 0 评论 -
代码随想录算法训练营第60天:动态and[1]
本周我们讲了动态规划之终极绝杀:编辑距离,为什么叫做终极绝杀呢?细心的录友应该知道,我们在前三篇动态规划的文章就一直为 编辑距离 这道题目做铺垫。心思的录友应该会发现我用了三道题做铺垫,才最后引出了动态规划:72.编辑距离**** ,Carl的良苦用心呀,你们体会到了嘛!原创 2024-07-02 12:13:45 · 605 阅读 · 0 评论 -
代码随想录算法训练营第59天:动态[1]
给定两个单词 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符。原创 2024-07-01 21:07:12 · 965 阅读 · 0 评论 -
代码随想录算法训练营第58天:动态[1]
这道题目算是编辑距离的入门题目(毕竟这里只是涉及到减法),也是动态规划解决的经典题型。这一类题都是题目读上去感觉很复杂,模拟一下也发现很复杂,用动规分析完了也感觉很复杂,但是最终代码却很简短。在之前的题目讲解中,我们讲了1143.最长公共子序列**** ,大家会发现 本题和 1143.最长公共子序列 的相似之处。编辑距离的题目最能体现出动规精髓和巧妙之处,大家可以好好体会一下。原创 2024-07-01 20:30:48 · 841 阅读 · 0 评论 -
代码随想录算法训练营第57天:动态
看到代码大家也可以发现其实就是求两个字符串的最长公共子序列,但如果没有做过1143.最长公共子序列**** ,本题其实还有很有难度的。这是Carl为什么要先讲1143.最长公共子序列**** 再讲本题,大家会发现一个正确的刷题顺序对算法学习是非常重要的!这也是Carl做了很多题目(包括ACM和力扣)才总结出来的规律,大家仔细体会一下哈。贪心算法:最大子序和(opens new window)动规的解法还是很直接的。原创 2024-06-12 15:32:02 · 1065 阅读 · 0 评论 -
代码随想录算法训练营第54天:动态
至此,股票系列正式剧终,全部讲解完毕!从买卖一次到买卖多次,从最多买卖两次到最多买卖k次,从冷冻期再到手续费,最后再来一个股票大总结,可以说对股票系列完美收官了。「代码随想录」值得推荐给身边每一位学习算法的朋友同学们,关注后都会发现相见恨晚!本题最关键的是要想到dp[i]由哪些状态可以推出来,并取最大值,那么很自然就能想到递推公式:dp[i] = max(dp[i], dp[j] + 1);子序列问题是动态规划的一个重要系列,本题算是入门题目,好戏刚刚开始。原创 2024-06-12 15:29:25 · 882 阅读 · 0 评论 -
代码随想录算法训练营第53天:动态股票3
这次把冷冻期这道题目,讲的很透彻了,细分为四个状态,其状态转移也十分清晰,建议大家都按照四个状态来分析,如果只划分三个状态确实很容易给自己绕进去。下周还会有一篇股票系列的文章,股票系列后面我也会单独写一篇总结,来高度概括一下,这样大家会对股票问题就有一个整体性的理解了。原创 2024-06-12 15:24:47 · 1037 阅读 · 0 评论 -
代码随想录算法训练营第51天:股票2
。原创 2024-06-12 15:22:46 · 768 阅读 · 0 评论 -
代码随想录算法训练营第50天:股票问题
刚刚结束了背包问题,本周主要讲解打家劫舍系列。劫舍系列简单来说就是 数组上连续元素二选一,成环之后连续元素二选一,在树上连续元素二选一,所能得到的最大价值。那么这里每一种情况 我在文章中都做了详细的介绍。周四我们开始讲解股票系列了,大家应该预测到了,我们下周的主题就是股票!敬请期待吧!代码随想录温馨提醒:投资有风险,入市需谨慎!原创 2024-06-12 15:20:40 · 821 阅读 · 0 评论 -
代码随想录算法训练营第49天:动态打家劫舍
多重背包在面试中基本不会出现,力扣上也没有对应的题目,大家对多重背包的掌握程度知道它是一种01背包,并能在01背包的基础上写出对应代码就可以了。至于背包九讲里面还有混合背包,二维费用背包,分组背包等等这些,大家感兴趣可以自己去学习学习,这里也不做介绍了,面试也不会考。年前我们已经把背包问题都讲完了,那么现在我们要对背包问题进行总结一番。背包问题是动态规划里的非常重要的一部分,所以我把背包问题单独总结一下,等动态规划专题更新完之后,我们还会在整体总结一波动态规划。关于这几种常见的背包,其关系如下:。原创 2024-06-12 15:05:56 · 751 阅读 · 0 评论 -
代码随想录算法训练营第48天:动态第8步
本周的主题其实就是背包问题中的遍历顺序!我这里做一下总结:动态规划:518.零钱兑换II**动态规划:377. 组合总和 Ⅳ**** 、动态规划:70. 爬楼梯进阶版(完全背包)**动态规划:322. 零钱兑换**** 、动态规划:279.完全平方数(opens new window)此时我们就已经把完全背包的遍历顺序研究的透透的了!本题和我们之前讲解回溯专题的回溯算法:分割回文串**** 非常像,所以我也给出了对应的回溯解法。原创 2024-06-12 14:39:09 · 926 阅读 · 0 评论 -
代码随想录算法训练营第47天:动态第7步
本题看起来是一道简单题目,稍稍进阶一下其实就是一个完全背包!如果我来面试的话,我就会先给候选人出一个 本题原题,看其表现,如果顺利写出来,进而在要求每次可以爬[1 - m]个台阶应该怎么写。顺便再考察一下两个for循环的嵌套顺序,为什么target放外面,nums放里面。这就能考察对背包问题本质的掌握程度,候选人是不是刷题背公式,一眼就看出来了。这么一连套下来,如果候选人都能答出来,相信任何一位面试官都是非常满意的。原创 2024-06-12 14:36:46 · 634 阅读 · 0 评论 -
代码随想录算法训练营第46天:动态第6步
细心的同学可能发现,全文我说的都是对于纯完全背包问题,其for循环的先后循环是可以颠倒的!但如果题目稍稍有点变化,就会体现在遍历顺序上。如果问装满背包有几种方式的话?那么两个for循环的先后顺序就有很大区别了,而leetcode上的题目都是这种稍有变化的类型。这个区别,我将在后面讲解具体leetcode题目中给大家介绍,因为这块如果不结合具题目,单纯的介绍原理估计很多同学会越看越懵!别急,下一篇就是了!最后,原创 2024-06-12 14:33:52 · 733 阅读 · 0 评论 -
代码随想录算法训练营第45天:动态第5步
这道题目就是一道01背包应用类的题目,需要我们拆解题目,然后套入01背包的场景。01背包相对于本题,主要要理解,题目中物品是nums[i],重量是nums[i],价值也是nums[i],背包体积是sum/2。看代码的话,就可以发现,基本就是按照01背包的写法来的。力扣题目链接(opens new window)题目难度:中等有一堆石头,每块石头的重量都是正整数。每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。原创 2024-06-12 14:25:52 · 922 阅读 · 0 评论 -
代码随想录算法训练营第44天:动态第4步
本周题目已经开始点难度了,特别是动态规划:不同的二叉搜索树**** 这道题目,明显感觉阅读量很低,可能是因为确实有点难吧。我现在也陷入了纠结,题目一简单,就会有录友和我反馈说题目太简单了,题目一难,阅读量就特别低。但我还会坚持规划好的路线,难度循序渐进,并以面试经典题目为准,该简单的时候就是简单,同时也不会因为阅读量低就放弃有难度的题目!。讲了这么多才刚刚把二维dp的01背包讲完,这里大家其实可以发现最简单的是推导公式了,推导公式估计看一遍就记下来了,但难就难在如何初始化和遍历顺序上。原创 2024-06-12 14:21:25 · 999 阅读 · 0 评论 -
代码随想录算法训练营第44天:动态第3步
本题掌握其动规的方法,就可以了,贪心的解法确实简单,但需要有数学证明,如果能自圆其说也是可以的。dp[2] = 2;dp[3] = 3;i <= n;j++) {这个代码也是可以过的!在解释递推公式的时候,也可以解释通,dp[i] 就等于 拆解i - j的最大乘积 * 拆解j的最大乘积。看起来没毛病!但是在解释初始化的时候,就发现自相矛盾了,dp[1]为什么一定是1呢?原创 2024-06-12 14:18:27 · 1070 阅读 · 0 评论 -
代码随想录算法训练营第42天:动态第二步
本周题目简单一些,也非常合适初学者来练练手。下周开始上难度了哈,然后大下周就开始讲解背包问题,好戏还在后面,录友们跟上哈。学算法,认准「代码随想录」就够了,Carl带你打怪升级!本文分别给出了深搜,动规,数论三种方法。深搜当然是超时了,顺便分析了一下使用深搜的时间复杂度,就可以看出为什么超时了。然后在给出动规的方法,依然是使用动规五部曲,这次我们就要考虑如何正确的初始化了,初始化和遍历顺序其实也很重要!本题是62.不同路径**** 的障碍版,整体思路大体一致。原创 2024-06-12 14:15:42 · 1117 阅读 · 0 评论 -
代码随想录算法训练营第40天:贪心最终章
本题只要想清楚个例,例如98,一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]减一,strNum[i]赋值9,这样这个整数就是89。就可以很自然想到对应的贪心解法了。想到了贪心,还要考虑遍历顺序,只有从后向前遍历才能重复利用上次比较的结果。最后代码实现的时候,也需要一些技巧,例如用一个flag来标记从哪里开始赋值9。本题的难点首先是要想到贪心的思路,然后就是遍历和状态推导。原创 2024-06-05 21:57:24 · 644 阅读 · 0 评论 -
代码随想录算法训练营第三十九天:贪心第四步
这道题目leetcode标记为贪心算法,说实话,我没有感受到贪心,找不出局部最优推出全局最优的过程。就是用最远出现距离模拟了圈字符的行为。但这道题目的思路是很巧妙的,所以有必要介绍给大家做一做,感受一下。本周的主题就是用贪心算法来解决区间问题,经过本周的学习,大家应该对区间的各种合并分割有一定程度的了解了。其实很多区间的合并操作看起来都是常识,其实贪心算法有时候就是常识,但也别小看了贪心算法。在贪心算法:合并区间**原创 2024-06-05 21:40:28 · 1088 阅读 · 0 评论 -
代码随想录算法训练营第38天:贪心第三步
咋眼一看好像很复杂,分析清楚之后,会发现逻辑其实非常固定。这道题目可以告诉大家,遇到感觉没有思路的题目,可以静下心来把能遇到的情况分析一下,只要分析到具体情况了,一下子就豁然开朗了。如果一直陷入想从整体上寻找找零方案,就会把自己陷进去,各种情况一交叉,只会越想越复杂了。关于出现两个维度一起考虑的情况,我们已经做过两道题目了,另一道就是135. 分发糖果****。其技巧都是确定一边然后贪心另一边,两边一起考虑,就会顾此失彼。这道题目可以说比135. 分发糖果**原创 2024-06-05 16:28:51 · 875 阅读 · 0 评论 -
代码随想录算法训练营第三十七天:贪心第二步[1]
贪心的题目如果简单起来,会让人简单到开始怀疑:本来不就应该这么做么?这也算是算法?我认为这不是贪心?本题其实很简单,不会贪心算法的同学都可以做出来,但是我还是全程用贪心的思路来讲解。因为贪心的思考方式一定要有!如果没有贪心的思考方式(局部最优,全局最优),很容易陷入贪心简单题凭感觉做,贪心难题直接不会做,其实这样就锻炼不了贪心的思考方式了。所以明知道是贪心简单题,也要靠贪心的思考方式来解题,这样对培养解题感觉很有帮助。大家会发现本周的代码其实都简单,但思路却很巧妙,并不容易写出来。原创 2024-06-05 16:25:35 · 888 阅读 · 0 评论 -
代码随想录算法训练营第三十五天:贪心第二步
本周我们讲解了贪心算法的理论基础**** ,了解了贪心本质:局部最优推出全局最优。然后讲解了第一道题目分发饼干**** ,还是比较基础的,可能会给大家一种贪心算法比较简单的错觉,因为贪心有时候接近于常识。其实我还准备一些简单的贪心题目,甚至网上很多都质疑这些题目是不是贪心算法。这些题目我没有立刻发出来,因为真的会让大家感觉贪心过于简单,而忽略了贪心的本质:局部最优和全局最优两个关键点。原创 2024-06-05 16:19:16 · 740 阅读 · 0 评论 -
代码随想录算法训练营第三十四天:贪心开始
贪心的本质是选择每一阶段的局部最优,从而达到全局最优。这么说有点抽象,来举一个例子:例如,有一堆钞票,你可以拿走十张,如果想达到最大的金额,你要怎么拿?指定每次拿最大的,最终结果就是拿走最大数额的钱。每次拿最大的就是局部最优,最后拿走最大数额的钱就是推出全局最优。再举一个例子如果是 有一堆盒子,你有一个背包体积为n,如何把背包尽可能装满,如果还每次选最大的盒子,就不行了。这时候就需要动态规划。动态规划的问题在下一个系列会详细讲解。本篇给出了什么是贪心以及大家关心的贪心算法固定套路。原创 2024-06-01 18:10:31 · 1180 阅读 · 0 评论 -
代码随想录算法训练营第三十二天:回溯的最终章
本篇本打算是对本周小结!(回溯算法系列三)**** 的一个点做一下纠正,没想到又写出来这么多!这个点都源于一位录友的疑问,然后我思考总结了一下,就写着这一篇,所以还是得多交流啊!如果大家对「代码随想录」文章有什么疑问,尽管打卡留言的时候提出来哈,或者在交流群里提问。其实这就是相互学习的过程,交流一波之后都对题目理解的更深刻了,我如果发现文中有问题,都会在评论区或者下一篇文章中即时修正,保证不会给大家带跑偏!这也可以用回溯法?其实深搜和回溯也是相辅相成的,毕竟都用递归。原创 2024-05-23 21:34:32 · 1056 阅读 · 0 评论 -
代码随想录算法训练营第三十一天:回溯算法
本题题解清一色都说是深度优先搜索,但我更倾向于说它用回溯法,而且本题我也是完全使用回溯法的逻辑来分析的。相信大家在本题中处处都能看到是回溯算法:求子集问题(二)**** 的身影,但处处又都是陷阱。对于养成思维定式或者套模板套嗨了的同学,这道题起到了很好的警醒作用。更重要的是拓展了大家的思路!每层都是从0开始搜索而不是startIndex需要used数组记录path里都放了哪些元素了排列问题是回溯算法解决的经典题目,大家可以好好体会体会。continue;continue;原创 2024-05-23 20:56:09 · 803 阅读 · 0 评论 -
代码随想录算法训练营第三十天:回溯加强
在131.分割回文串**** 中我列举的分割字符串的难点,本题都覆盖了。而且本题还需要操作字符串添加逗号作为分隔符,并验证区间的合法性。可以说是131.分割回文串**** 的加强版。在本文的树形结构图中,我已经把详细的分析思路都画了出来,相信大家看了之后一定会思路清晰不少!相信大家经过了77.组合(opens new window)回溯算法:组合问题再剪剪枝(opens new window)216.组合总和III(opens new window)原创 2024-05-16 16:43:45 · 317 阅读 · 0 评论 -
代码随想录算法训练营第29天:回溯进阶
本题和我们之前讲过的77.组合**** 、216.组合总和III**组合没有数量要求元素可无限重复选取针对这两个问题,我都做了详细的分析。并且给出了对于组合问题,什么时候用startIndex,什么时候不用,并用17.电话号码的字母组合**** 做了对比。最后还给出了本题的剪枝优化,这个优化如果是初学者的话并不容易想到。在求和问题中,排序之后加剪枝是常见的套路!可以看出我写的文章都会大量引用之前的文章,就是要不断作对比,分析其差异,然后给出代码解决的方法,这样才能彻底理解题目的本质与难点。原创 2024-05-16 16:04:36 · 583 阅读 · 0 评论