自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(67)
  • 收藏
  • 关注

原创 第二讲 数据结构

并查集是一种简单而高效的数据结构,特别适用于一些需要频繁合并和查找操作的场景。通过路径压缩和按秩合并的优化,可以在近乎常数时间内处理动态连通性问题。不论是在图论问题、网络连通性检测还是其他需要判定等价关系的领域,并查集都显示出其强大的优势。!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 1972 1

原创 第一讲 基础算法

acwing的基础第一章总结

2024-07-11 15:32:56 498 1

原创 代码随想录算法训练营第75天:总结篇[1]

题,后面决定加入训练营与大家齐头并进,刚开始气氛很好,我也是因为前面基础篇都是二三刷,自己也有思路去总结博客,到后面难度上来了,我就只能去理解文章题意,疏通明白后手敲代码一遍,把网站上的内容粘到博客上,当然这只是开始,我想说我还是会在接下来的时间去深入学习的,我遇到的比较难的几个点,一个应该是二叉树的时期,简直太多了,当时也搞不懂,但是还是跌跌撞撞的坚持下来,大家写算法其实没必要要求一下子全部都掌握,我就是保持进。

2024-07-05 12:03:09 202

原创 代码随想录算法训练营第74天:路径总结[1]

至此已经讲解了四大最短路算法,分别是Dijkstra、Bellman_ford、SPFA 和 Floyd。dijkstra朴素版dijkstra堆优化版Bellman_ford 队列优化算法(又名SPFA)bellman_ford 算法判断负权回路bellman_ford之单源有限最短路Floyd 算法精讲启发式搜索:A * 算法最短路算法比较复杂,而且各自有各自的应用场景,我来用一张表把讲过的最短路算法的使用场景都展现出来:​​。

2024-07-05 11:46:39 1124

原创 代码随想录算法训练营第71天:路径算法[1]

本题是单源有限最短路问题,也是 bellman_ford的一个拓展问题,如果理解bellman_ford 其实思路比较容易理解,但有很多细节。例如 为什么要用 minDist_copy 来记录上一轮 松弛的结果。这也是本篇我为什么花了这么大篇幅讲解的关键所在。边的顺序的影响本题的本质SPFA的解法能否用dijkstra学透了以上四个拓展,相信大家会对bellman_ford有更深入的理解。

2024-07-05 11:44:27 1016

原创 代码随想录算法训练营第71天:路径算法[1]

Bellman_ford 是可以计算 负权值的单源最短路算法。其算法核心思路是对 所有边进行 n-1 次 松弛。弄清楚 什么是 松弛?为什么要 n-1 次?对理解Bellman_ford 非常重要。

2024-07-05 11:42:11 850

原创 代码随想录算法训练营第70天图论9[1]

本篇,我们深入讲解的dijkstra算法,详细模拟其工作的流程。这里我给出了dijkstra 三部曲 来 帮助大家理解 该算法,不至于 每次写 dijkstra 都是黑盒操作,没有框架没有章法。在给出的代码中,我也按照三部曲的逻辑来给大家注释,只要理解这三部曲,即使 过段时间 对 dijkstra 算法有些遗忘,依然可以写出一个框架出来,然后再去调试细节。对于图论算法,一般代码都比较长,很难写出代码直接可以提交通过,都需要一个debug的过程,所以学习如何debug 非常重要!

2024-07-04 21:17:53 501

原创 代码随想录算法训练营第69天:图论7[1]

最后我们就生成了一个 最小生成树, 绿色的边将所有节点链接到一起,并且 保证权值是最小的,因为我们在更新 minDist 数组的时候,都是选距离 最小生成树最近的点 加入到树中。讲解上面的模拟过程的时候,我已经强调多次 minDist数组 是记录了 所有非生成树节点距离生成树的最小距离。最后,minDist数组 也就是记录的是最小生成树所有边的权值。

2024-07-04 21:15:48 531

原创 代码随想录算法训练营第68天:图论6[1]

本篇我们讲解了并查集的背景、原理、两种优化方式(路径压缩,按秩合并),代码模板,常见误区,以及模拟过程。要知道并查集解决什么问题,在什么场景下我们要想到使用并查集。接下来进一步优化并查集的执行效率,重点介绍了路径压缩的方式,另一种方法:按秩合并,我们在 「拓展」中讲解。通过一步一步的原理讲解,最后给出并查集的模板,所有的并查集题目都在这个模板的基础上进行操作或者适当修改。但只给出模板还是不够的,针对大家学习并查集的常见误区,详细讲解了模板代码的细节。

2024-07-04 21:13:58 452

原创 代码随想录算法训练营第67天:图论5[1]

‍。

2024-07-04 11:45:44 1199

原创 代码随想录算法训练营第66天:图论4[1]

题目描述:现有一个 N × M 的矩阵,每个单元格包含一个数值,这个数值代表该位置的相对高度。矩阵的左边界和上边界被认为是第一组边界,而矩阵的右边界和下边界被视为第二组边界。矩阵模拟了一个地形,当雨水落在上面时,水会根据地形的倾斜向低处流动,但只能从较高或等高的地点流向较低或等高并且相邻(上下左右方向)的地点。我们的目标是确定那些单元格,从这些单元格出发的水可以达到第一组边界和第二组边界。输入描述:第一行包含两个整数 N 和 M,分别表示矩阵的行数和列数。

2024-07-03 18:10:33 907

原创 代码随想录算法训练营第65天:图论3[1]

‍。

2024-07-03 18:02:33 785

原创 代码随想录算法训练营第64天:图论2[1]

当然广搜还有很多细节需要注意的地方,后面我会针对广搜的题目还做针对性的讲解。因为在理论篇讲太多细节,可能会让刚学广搜的录友们越看越懵,所以细节方面针对具体题目在做讲解。本篇我们重点讲解了广搜的使用场景,广搜的过程以及广搜的代码框架。其实在二叉树章节的层序遍历​**** 中,我们也讲过一次广搜,相当于是广搜在二叉树这种数据结构上的应用。这次则从图论的角度上再详细讲解一次广度优先遍历。相信看完本篇,大家会对广搜有一个基础性的认识,后面再来做对应的题目就会得心应手一些。

2024-07-03 12:15:23 799

原创 代码随想录算法训练营第63天:图论[1]

以上知识点 大家先有个印象,上面提到的每个知识点,其实都需要大篇幅才能讲明白的。我这里先给大家做一个概括,后面章节会针对每个知识点都会有对应的算法题和针对性的讲解,大家再去深入学习。图论是非常庞大的知识体系,上面的内容还不足以概括图论内容,仅仅是理论基础而已。在图论章节我会带大家深入讲解 深度优先搜索(DFS)、广度优先搜索(BFS)、并查集、拓扑排序、最小生成树系列、最短路算法系列等等。敬请期待!我们讲解了,dfs 和 bfs的大体区别(bfs详细过程下篇来讲),dfs的搜索过程以及代码框架。

2024-07-03 12:13:30 734

原创 代码随想录算法训练营第62天:单调栈进阶[1]

‍力扣题目链接(opens new window)给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。示例 1:​​示例 2:《代码随想录》算法视频公开课 ****(opens new window)****​ :​单调栈,经典来袭!LeetCode:42.接雨水 ****(opens new window)****​ ,相信结合视频在看本篇题解,更有助于大家对本题的理解。接雨水问题在面试中还是常见题目的,有必要好好讲一讲。本文深度讲解如下三种方法:本题暴力解法

2024-07-02 17:26:08 609

原创 代码随想录算法训练营第62天:单调栈[1]

题目说如果不存在对应位置就输出 -1 ,所以result数组如果某位置没有被赋值,那么就应该是是-1,所以就初始化为-1。在遍历nums2的过程中,我们要判断nums2[i]是否在nums1中出现过,因为最后是要根据nums1元素的下标来更新result数组。

2024-07-02 17:23:40 288

原创 代码随想录算法训练营第60天:动态and[1]

本周我们讲了动态规划之终极绝杀:编辑距离,为什么叫做终极绝杀呢?细心的录友应该知道,我们在前三篇动态规划的文章就一直为 编辑距离 这道题目做铺垫。心思的录友应该会发现我用了三道题做铺垫,才最后引出了动态规划:72.编辑距离​**** ,Carl的良苦用心呀,你们体会到了嘛!

2024-07-02 12:13:45 592

原创 代码随想录算法训练营第59天:动态[1]

给定两个单词 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符。

2024-07-01 21:07:12 943

原创 代码随想录算法训练营第58天:动态[1]

这道题目算是编辑距离的入门题目(毕竟这里只是涉及到减法),也是动态规划解决的经典题型。这一类题都是题目读上去感觉很复杂,模拟一下也发现很复杂,用动规分析完了也感觉很复杂,但是最终代码却很简短。在之前的题目讲解中,我们讲了1143.最长公共子序列​**** ,大家会发现 本题和 1143.最长公共子序列 的相似之处。编辑距离的题目最能体现出动规精髓和巧妙之处,大家可以好好体会一下。

2024-07-01 20:30:48 817

原创 代码随想录算法训练营第57天:动态

看到代码大家也可以发现其实就是求两个字符串的最长公共子序列,但如果没有做过1143.最长公共子序列​**** ,本题其实还有很有难度的。这是Carl为什么要先讲1143.最长公共子序列​**** 再讲本题,大家会发现一个正确的刷题顺序对算法学习是非常重要的!这也是Carl做了很多题目(包括ACM和力扣)才总结出来的规律,大家仔细体会一下哈。贪心算法:最大子序和(opens new window)动规的解法还是很直接的。

2024-06-12 15:32:02 1043

原创 代码随想录算法训练营第54天:动态

至此,股票系列正式剧终,全部讲解完毕!从买卖一次到买卖多次,从最多买卖两次到最多买卖k次,从冷冻期再到手续费,最后再来一个股票大总结,可以说对股票系列完美收官了。「代码随想录」值得推荐给身边每一位学习算法的朋友同学们,关注后都会发现相见恨晚!本题最关键的是要想到dp[i]由哪些状态可以推出来,并取最大值,那么很自然就能想到递推公式:dp[i] = max(dp[i], dp[j] + 1);子序列问题是动态规划的一个重要系列,本题算是入门题目,好戏刚刚开始‍。

2024-06-12 15:29:25 865

原创 代码随想录算法训练营第53天:动态股票3

这次把冷冻期这道题目,讲的很透彻了,细分为四个状态,其状态转移也十分清晰,建议大家都按照四个状态来分析,如果只划分三个状态确实很容易给自己绕进去。下周还会有一篇股票系列的文章,股票系列后面我也会单独写一篇总结,来高度概括一下,这样大家会对股票问题就有一个整体性的理解了。

2024-06-12 15:24:47 1017

原创 代码随想录算法训练营第51天:股票2

‍。

2024-06-12 15:22:46 749

原创 代码随想录算法训练营第50天:股票问题

刚刚结束了背包问题,本周主要讲解打家劫舍系列。劫舍系列简单来说就是 数组上连续元素二选一,成环之后连续元素二选一,在树上连续元素二选一,所能得到的最大价值。那么这里每一种情况 我在文章中都做了详细的介绍。周四我们开始讲解股票系列了,大家应该预测到了,我们下周的主题就是股票!敬请期待吧!代码随想录温馨提醒:投资有风险,入市需谨慎!

2024-06-12 15:20:40 801

原创 代码随想录算法训练营第49天:动态打家劫舍

多重背包在面试中基本不会出现,力扣上也没有对应的题目,大家对多重背包的掌握程度知道它是一种01背包,并能在01背包的基础上写出对应代码就可以了。至于背包九讲里面还有混合背包,二维费用背包,分组背包等等这些,大家感兴趣可以自己去学习学习,这里也不做介绍了,面试也不会考。年前我们已经把背包问题都讲完了,那么现在我们要对背包问题进行总结一番。背包问题是动态规划里的非常重要的一部分,所以我把背包问题单独总结一下,等动态规划专题更新完之后,我们还会在整体总结一波动态规划。关于这几种常见的背包,其关系如下:​。

2024-06-12 15:05:56 742

原创 代码随想录算法训练营第48天:动态第8步

本周的主题其实就是背包问题中的遍历顺序!我这里做一下总结:动态规划:518.零钱兑换II​**动态规划:377. 组合总和 Ⅳ​**** 、动态规划:70. 爬楼梯进阶版(完全背包)​**动态规划:322. 零钱兑换​**** 、动态规划:279.完全平方数(opens new window)此时我们就已经把完全背包的遍历顺序研究的透透的了!本题和我们之前讲解回溯专题的回溯算法:分割回文串​**** 非常像,所以我也给出了对应的回溯解法。

2024-06-12 14:39:09 901

原创 代码随想录算法训练营第47天:动态第7步

本题看起来是一道简单题目,稍稍进阶一下其实就是一个完全背包!如果我来面试的话,我就会先给候选人出一个 本题原题,看其表现,如果顺利写出来,进而在要求每次可以爬[1 - m]个台阶应该怎么写。顺便再考察一下两个for循环的嵌套顺序,为什么target放外面,nums放里面。这就能考察对背包问题本质的掌握程度,候选人是不是刷题背公式,一眼就看出来了。这么一连套下来,如果候选人都能答出来,相信任何一位面试官都是非常满意的。

2024-06-12 14:36:46 614

原创 代码随想录算法训练营第46天:动态第6步

细心的同学可能发现,全文我说的都是对于纯完全背包问题,其for循环的先后循环是可以颠倒的!但如果题目稍稍有点变化,就会体现在遍历顺序上。如果问装满背包有几种方式的话?那么两个for循环的先后顺序就有很大区别了,而leetcode上的题目都是这种稍有变化的类型。这个区别,我将在后面讲解具体leetcode题目中给大家介绍,因为这块如果不结合具题目,单纯的介绍原理估计很多同学会越看越懵!别急,下一篇就是了!最后,

2024-06-12 14:33:52 719

原创 代码随想录算法训练营第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 902

原创 代码随想录算法训练营第44天:动态第4步

本周题目已经开始点难度了,特别是动态规划:不同的二叉搜索树​**** 这道题目,明显感觉阅读量很低,可能是因为确实有点难吧。我现在也陷入了纠结,题目一简单,就会有录友和我反馈说题目太简单了,题目一难,阅读量就特别低。但我还会坚持规划好的路线,难度循序渐进,并以面试经典题目为准,该简单的时候就是简单,同时也不会因为阅读量低就放弃有难度的题目!。​​讲了这么多才刚刚把二维dp的01背包讲完,这里大家其实可以发现最简单的是推导公式了,推导公式估计看一遍就记下来了,但难就难在如何初始化和遍历顺序上。

2024-06-12 14:21:25 974

原创 代码随想录算法训练营第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 1041

原创 代码随想录算法训练营第42天:动态第二步

本周题目简单一些,也非常合适初学者来练练手。下周开始上难度了哈,然后大下周就开始讲解背包问题,好戏还在后面,录友们跟上哈。学算法,认准「代码随想录」就够了,Carl带你打怪升级!本文分别给出了深搜,动规,数论三种方法。深搜当然是超时了,顺便分析了一下使用深搜的时间复杂度,就可以看出为什么超时了。然后在给出动规的方法,依然是使用动规五部曲,这次我们就要考虑如何正确的初始化了,初始化和遍历顺序其实也很重要!本题是62.不同路径​**** 的障碍版,整体思路大体一致。

2024-06-12 14:15:42 1091

原创 代码随想录算法训练营第41天:动态规划开始

动态规划,英文:Dynamic Programming,简称DP,如果某一问题有很多重叠子问题,使用动态规划是最有效的。所以动态规划中每一个状态一定是由上一个状态推导出来的,这一点就区分于贪心,贪心没有状态推导,而是从局部直接选最优的,在关于贪心算法,你该了解这些!​**** 中我举了一个背包问题的例子。例如:有N件物品和一个最多能背重量为W 的背包。第i件物品的重量是weight[i],得到的价值是value[i]。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。

2024-06-12 14:11:45 700

原创 代码随想录算法训练营第40天:贪心最终章

本题只要想清楚个例,例如98,一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]减一,strNum[i]赋值9,这样这个整数就是89。就可以很自然想到对应的贪心解法了。想到了贪心,还要考虑遍历顺序,只有从后向前遍历才能重复利用上次比较的结果。最后代码实现的时候,也需要一些技巧,例如用一个flag来标记从哪里开始赋值9。本题的难点首先是要想到贪心的思路,然后就是遍历和状态推导。

2024-06-05 21:57:24 622

原创 代码随想录算法训练营第三十九天:贪心第四步

这道题目leetcode标记为贪心算法,说实话,我没有感受到贪心,找不出局部最优推出全局最优的过程。就是用最远出现距离模拟了圈字符的行为。但这道题目的思路是很巧妙的,所以有必要介绍给大家做一做,感受一下。本周的主题就是用贪心算法来解决区间问题,经过本周的学习,大家应该对区间的各种合并分割有一定程度的了解了。其实很多区间的合并操作看起来都是常识,其实贪心算法有时候就是常识,但也别小看了贪心算法。在贪心算法:合并区间​**

2024-06-05 21:40:28 1061

原创 代码随想录算法训练营第38天:贪心第三步

咋眼一看好像很复杂,分析清楚之后,会发现逻辑其实非常固定。这道题目可以告诉大家,遇到感觉没有思路的题目,可以静下心来把能遇到的情况分析一下,只要分析到具体情况了,一下子就豁然开朗了。如果一直陷入想从整体上寻找找零方案,就会把自己陷进去,各种情况一交叉,只会越想越复杂了。关于出现两个维度一起考虑的情况,我们已经做过两道题目了,另一道就是135. 分发糖果​****。其技巧都是确定一边然后贪心另一边,两边一起考虑,就会顾此失彼。这道题目可以说比135. 分发糖果​**

2024-06-05 16:28:51 857

原创 代码随想录算法训练营第三十七天:贪心第二步[1]

贪心的题目如果简单起来,会让人简单到开始怀疑:本来不就应该这么做么?这也算是算法?我认为这不是贪心?本题其实很简单,不会贪心算法的同学都可以做出来,但是我还是全程用贪心的思路来讲解。因为贪心的思考方式一定要有!如果没有贪心的思考方式(局部最优,全局最优),很容易陷入贪心简单题凭感觉做,贪心难题直接不会做,其实这样就锻炼不了贪心的思考方式了。所以明知道是贪心简单题,也要靠贪心的思考方式来解题,这样对培养解题感觉很有帮助。大家会发现本周的代码其实都简单,但思路却很巧妙,并不容易写出来。

2024-06-05 16:25:35 870

原创 代码随想录算法训练营第三十五天:贪心第二步

本周我们讲解了贪心算法的理论基础​**** ,了解了贪心本质:局部最优推出全局最优。然后讲解了第一道题目分发饼干​**** ,还是比较基础的,可能会给大家一种贪心算法比较简单的错觉,因为贪心有时候接近于常识。其实我还准备一些简单的贪心题目,甚至网上很多都质疑这些题目是不是贪心算法。这些题目我没有立刻发出来,因为真的会让大家感觉贪心过于简单,而忽略了贪心的本质:局部最优和全局最优两个关键点。

2024-06-05 16:19:16 712

原创 代码随想录算法训练营第三十四天:贪心开始

贪心的本质是选择每一阶段的局部最优,从而达到全局最优。这么说有点抽象,来举一个例子:例如,有一堆钞票,你可以拿走十张,如果想达到最大的金额,你要怎么拿?指定每次拿最大的,最终结果就是拿走最大数额的钱。每次拿最大的就是局部最优,最后拿走最大数额的钱就是推出全局最优。再举一个例子如果是 有一堆盒子,你有一个背包体积为n,如何把背包尽可能装满,如果还每次选最大的盒子,就不行了。这时候就需要动态规划。动态规划的问题在下一个系列会详细讲解。本篇给出了什么是贪心以及大家关心的贪心算法固定套路。

2024-06-01 18:10:31 1153

原创 代码随想录算法训练营第三十二天:回溯的最终章

本篇本打算是对本周小结!(回溯算法系列三)​**** 的一个点做一下纠正,没想到又写出来这么多!这个点都源于一位录友的疑问,然后我思考总结了一下,就写着这一篇,所以还是得多交流啊!如果大家对「代码随想录」文章有什么疑问,尽管打卡留言的时候提出来哈,或者在交流群里提问。其实这就是相互学习的过程,交流一波之后都对题目理解的更深刻了,我如果发现文中有问题,都会在评论区或者下一篇文章中即时修正,保证不会给大家带跑偏!这也可以用回溯法?其实深搜和回溯也是相辅相成的,毕竟都用递归。

2024-05-23 21:34:32 1028

思源笔记,平常电子笔记很方便

我博客就是用这个写的很简洁方便

2024-04-24

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除