- 博客(53)
- 收藏
- 关注
原创 代码随想录算法训练营打卡第66天|Floyd 算法精讲、A * 算法精讲 (A star算法)、最短路算法总结篇
四大最短路算法,分别是Dijkstra、Bellman_ford、SPFA 和 Floyd。如果遇到单源且边为正数,直接Dijkstra。至于使用朴素版还是 堆优化版 还是取决于图的稠密度, 多少节点多少边算是稠密图,多少算是稀疏图,这个没有量化,如果想量化只能写出两个版本然后做实验去测试,不同的判题机得出的结果还不太一样。一般情况下,可以直接用堆优化版本。如果遇到单源边可为负数,直接 Bellman-Ford,同样 SPFA 还是 Bellman-Ford 取决于图的稠密度。
2026-03-07 16:00:04
194
原创 代码随想录算法训练营打卡第65天|Bellman_ford 队列优化算法(又名SPFA)、bellman_ford之判断负权回路、bellman_ford之单源有限最短路
思路:利用队列优化bellman_ford算法,将和源点相邻的边进行松弛,之后将节点加入队列,依次取出作为新的源点进行松弛,优化了每次松弛要处理的边的数量。思路:本题要求不经过超过k个城市,则只需松弛k+1次,因此直接替换start和end为src和dist,并将松弛次数改为k+1即可。思路:在原来的基础上多松弛一次检查数据是否会发生变化,如果数据一致则不存在负权回路,反正则存在。
2026-03-05 19:05:51
38
原创 代码随想录算法训练营打卡第64天|dijkstra(堆优化版)精讲、Bellman_ford 算法精讲
思路:本题权值可以出现负数,因此不能使用dijistra算法,bellman_ford算法可以解决这种问题。思路:本题考虑图的顶点很多但是边很少的情况如何优化,利用小顶堆和邻接表来优化算法。
2026-03-05 17:44:23
16
原创 代码随想录算法训练营打卡第63天|拓扑排序精讲、dijkstra(朴素版)精讲
思路:利用辅助数组inDegree记录每个节点的入度,将入度为0的节点加入队列中处理,最后如果结果中的节点小于n则证明不能转为拓扑排序。3、更新非访问节点到源点的距离(即更新minDist数组)思路:求最短路径利用dijkstra算法,三部曲。1、选源点到哪个节点近且该节点未被访问过。源点距离源点最近,距离为0,且未被访问。2、该最近节点被标记访问过。
2026-03-03 18:21:53
13
原创 代码随想录算法训练营打卡第62天|prim算法精讲、kruskal算法精讲
本文介绍了两种最小生成树算法:Prim算法和Kruskal算法。Prim算法通过每次选取距离生成树最近的节点来构建最小生成树,使用minDist和isInTree数组辅助实现。Kruskal算法则通过排序边并利用并查集依次添加最小边来构建,避免形成环路。两种算法分别适用于不同场景:Prim适合稠密图,Kruskal适合稀疏图。文中提供了两种算法的完整C++实现代码,包括邻接矩阵表示和并查集操作等关键步骤。
2026-03-02 17:58:02
13
原创 代码随想录算法训练营打卡第60天|108.多余的边、109.多余的边II
本文介绍了两种查找图中多余边的算法。108题使用并查集处理无向图,通过判断边的两个顶点是否在同一集合来检测多余边。109题针对有向图,先检查入度为2的节点,尝试删除相关边后判断是否形成树;若无则使用并查集检测形成环的边。两题均采用并查集作为核心数据结构,但处理策略不同:无向图直接检测连通性,有向图需考虑入度和环检测。代码实现包含并查集的初始化、查找、合并等基本操作,并针对不同图类型设计了相应的边检测逻辑。
2026-03-02 17:20:37
51
原创 代码随想录算法训练营打卡第59天|并查集理论基础,寻找存在的路径
本文介绍了并查集的基本原理和实现方法。并查集包含三个核心功能:find()查找根节点、join()合并集合、isSame()判断连通性。文章提供了C++实现模板,包含路径压缩优化,并通过无向图连通性判断的案例展示了应用方法。代码演示了如何初始化并查集、处理边连接关系,最终判断两个节点是否连通。该数据结构适用于处理节点分组和连通性问题,具有高效的时间复杂度。
2026-03-01 20:20:14
53
原创 代码随想录算法训练营打卡第58天|110.字符串接龙 、105.有向图的完全可达性、106.岛屿的周长
本文包含三个算法题的解题思路与代码实现:1.字符串接龙(110题)使用广度优先搜索,将字符串视为图的顶点,通过字母变换寻找最短路径;2.有向图完全可达性(105题)采用深度优先遍历检查图的连通性;3.岛屿周长计算(106题)通过遍历陆地格子并检查其四周边界情况来统计海岸线长度。三个问题分别涉及BFS、DFS和矩阵遍历等算法思想,代码均使用C++实现,包含完整输入输出处理。
2026-03-01 19:28:31
39
原创 代码随想录算法训练营打卡第57天|101.孤岛的总面积、102.沉没孤岛、103.水流问题、104..建造最大岛屿
本文介绍了四个岛屿相关的算法题目及解题思路: 孤岛总面积:从矩阵四周开始DFS搜索,标记可达陆地为0,最后统计剩余1的数量即为孤岛面积。 沉没孤岛:使用标记数组记录访问状态,从四周DFS遍历,未被标记的陆地即为需要沉没的孤岛。 水流问题:通过DFS标记可达节点,判断是否同时到达两组边界(上下和左右)。 建造最大岛屿:先DFS统计各岛屿面积,再遍历海洋计算填海后可能形成的最大岛屿面积。 所有题目均采用DFS算法解决,通过不同标记方式和边界条件处理,实现对岛屿问题的求解。
2026-02-25 16:12:31
39
原创 代码随想录算法训练营打卡第56天|99.岛屿数量 深搜、99.岛屿数量 广搜、100.岛屿的最大面积
本文介绍了三种岛屿问题的算法解决方案:1. 岛屿数量(深度优先搜索):遍历网格,遇到未访问的陆地时计数+1,使用DFS标记所有相连陆地。2. 岛屿数量(广度优先搜索):同样遍历网格,使用BFS队列标记相邻陆地。3. 岛屿最大面积:在DFS基础上增加count计数器,记录每个岛屿的面积并取最大值。三种方法都采用二维数组表示网格,使用访问标记数组避免重复计算,通过四个方向的移动检查相邻陆地。核心思路都是遍历+标记,区别在于搜索方式(DFS/BFS)和是否统计面积。
2026-02-24 12:36:30
15
原创 代码随想录算法训练营打卡第55天|深搜理论基础、98. 所有可达路径、广搜理论基础
思路:本题要求路径,因此需要一维数组存路径,二维数组存结果,深度优先搜索先找当前节点的邻接点,如果找到目标点则添加路径到结果,回溯时需要从路径删除节点。深度搜索即一条路走到底,之后回溯找节点未访问过的节点。广度优先搜索则是一层一层遍历,像水漫开一样。
2026-02-24 11:40:32
18
原创 代码随想录算法训练营打卡第54天|42. 接雨水、84.柱状图中最大的矩形
本文介绍了LeetCode中两道经典的单调栈问题解法。42题"接雨水"使用单调栈按行计算雨水,当遇到比栈顶高的柱子时,弹出栈顶计算当前层的水量,时间复杂度O(n)。84题"柱状图最大矩形"同样使用单调栈,但在遇到比栈顶低的柱子时弹出计算面积,通过首尾补0简化边界处理。两题都利用了单调栈维护高度递减序列的特性,在弹出元素时计算相应结果,展示了单调栈在解决区间极值问题中的巧妙应用。
2026-02-22 21:12:08
49
原创 代码随想录算法训练营打卡第53天|739. 每日温度、496.下一个更大元素 I、503.下一个更大元素II
本文介绍了三道使用单调栈解决温度/元素查找问题的算法题解:1. 739题利用单调栈计算每日温度后的升温天数,栈中存储下标,遇到更高温度时弹出栈顶并计算天数差;2. 496题在nums2中查找nums1元素的下一个更大值,通过哈希表记录nums1元素位置;3. 503题处理循环数组时,通过数组复制实现循环遍历,最后调整结果数组大小。三题均采用类似单调栈结构,根据元素大小关系进行入栈/出栈操作,时间复杂度O(n)。
2026-02-21 20:33:07
47
原创 代码随想录算法训练营打卡第46天|647. 回文子串、516.最长回文子序列
思路:回文子串动态规划dp数组表示从i到j区间是否为回文子串,如果s[i]==s[j],dp[i][j]=dp[i+1][j-1],二维数组只需要遍历上三角,初始化为0因此还要区分j-i<=1和>1的情况,因为j-i<=1时dp[i+1][j-1]在下三角矩阵,为0;思路:和上一题的区别是这个可以不连续,而且dp数组表示的是最大数量。因此对角线初始化为1,如果相等则取dp[i+1][j-1]+2,代表同时加入两头的元素,不相等则取加入i和加入j的最大值。
2026-02-19 10:55:47
47
原创 代码随想录算法训练营打卡第45天|115.不同的子序列、583. 两个字符串的删除操作、72. 编辑距离
本文介绍了三个动态规划解决字符串问题的算法:1) 115题计算字符串s中子序列等于t的数量,使用二维数组处理字符匹配情况;2) 583题求使两个字符串相等的最小删除操作次数,初始化删除次数后比较字符;3) 72题计算字符串编辑距离,考虑替换、插入和删除操作。三题都采用动态规划方法,通过二维数组记录状态转移,根据字符匹配情况采取不同处理策略。
2026-02-18 11:05:26
51
原创 代码随想录算法训练营打卡第44天|1143.最长公共子序列、1035.不相交的线、53. 最大子数组和、392.判断子序列
思路:这道题贪心算法的时候写过,用动态规划法则是一维数组,dp[i - 1] + nums[i],即:nums[i]加入当前连续子序列和,nums[i],即:从头开始计算当前连续子序列和。思路:利用二维数组分别代表text1和text2,如果找到相同的字母就对角线加1,没找到就取上和左的最大值。思路:本题说是求绘制的最大连线数,其实就是求两个字符串的最长公共子序列的长度,代码和求最长公共子序列相同。
2026-02-17 12:16:26
41
原创 代码随想录算法训练营打卡第43天|300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组
本文介绍了三个最长子序列问题的动态规划解法。300题求最长递增子序列,使用双重循环比较元素并更新dp数组;674题求最长连续递增序列,只需比较相邻元素;718题求最长重复子数组,通过二维dp数组记录匹配情况。三题均通过维护dp数组和result变量求解,时间复杂度分别为O(n²)、O(n)和O(mn)。核心思路都是利用动态规划记录中间状态,逐步更新最优解。
2026-02-16 11:42:36
47
原创 代码随想录算法训练营打卡第42天|188.买卖股票的最佳时机IV、309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费
思路:和买卖股票的最佳时机2差不多,就是卖出去的时候要扣除手续费。思路:这个和之前的区别就是有k次买卖,奇数次买入,偶数卖出。思路:一共有四个状态,掌握每个状态的转移图就行。
2026-02-10 20:02:01
40
原创 代码随想录算法训练营打卡第41天|121. 买卖股票的最佳时机、122.买卖股票的最佳时机II、123.买卖股票的最佳时机III
本文介绍了LeetCode上三道股票买卖问题的动态规划解法。121题使用二维数组记录持有/不持有股票的状态,通过滚动数组优化空间;122题在121题基础上允许多次交易,修改状态转移方程;123题限制最多两次交易,使用5个状态表示不同交易阶段。每道题都给出了状态转移方程和对应的C++实现代码,展示了动态规划在股票买卖问题中的应用。
2026-02-09 11:31:49
50
原创 代码随想录算法训练营打卡第39天|198.打家劫舍、213.打家劫舍II、337.打家劫舍III
思路:因为当前节点选不选取决于孩子,因此要用后序遍历。返回值为两个元素的数组,代表选和不选的最大值。如果遇到空节点返回{0,0}思路:利用动态规划,当前的最大值为偷当前和不偷的最大值,偷则为dp[i-2]+nums[i],不偷则为dp[i-1]思路:本题和前一个的区别在于本题首位相邻,因此要分为考虑头和考虑尾两种情况。初始化dp[0]为nums[0],dp[1]为前两个数的最大值。
2026-02-07 11:06:04
69
原创 代码随想录算法训练营打卡第38天|322. 零钱兑换、279.完全平方数、139.单词拆分、多重背包
思路:属于完全背包问题,但是求的是最小值,value是硬币数量,weight是硬币价值,amount为背包容量。思路:将字典存入set集合,如果dp[j]为真,j~i的字符串在字典中则dp[i]为真。思路:我自己做是用了一个数组将完全平方数存起来当作物品,也可以遍历时直接用i*i。思路:本题是将多个物品数量不相等,也不能无限取的问题转为01背包问题。因为要求最小值因此要初始化为INT_MAX。
2026-02-06 11:14:40
51
原创 代码随想录算法训练营打卡第37天|完全背包、518. 零钱兑换 II、377. 组合总和 Ⅳ、70. 爬楼梯
思路:完全背包和01背包区别在于完全背包可以装无数个相同的物品,因此dp数组的推导公式变为dp[i][j]=max(dp[i-1][j],dp[i][j-weight(i)]+value(i));如dp[1][4]可以分为装物品1(dp[1][1]+value(1))和不装物品1(dp[0][4])思路:因为每种硬币有无数种所以利用完全背包,要求组合数因此先遍历物品再遍历背包。思路:利用完全背包,背包容量为楼梯数,物品为每次可以爬的格数。思路:组合要求不能重复因此先遍历背包再遍历物品。
2026-02-05 20:52:08
278
原创 代码随想录算法训练营打卡第36天|1049. 最后一块石头的重量 II、494. 目标和、474.一和零
本文介绍了三个背包问题的LeetCode题解。1049题将石头分组转化为01背包问题,计算两堆石头最小差值;494题通过数学转换将目标和问题转化为背包问题;474题则是二维背包问题,统计字符串中0和1的数量来求解。三题都运用动态规划思想,通过构建dp数组来求解最优解,展示了背包问题在不同场景下的应用。代码实现均采用自底向上的动态规划方法,通过遍历物品和背包容量来更新状态。
2026-02-04 11:38:49
62
原创 代码随想录算法训练营打卡第35天|01背包问题 二维、01背包问题 一维、416. 分割等和子集
本文介绍了01背包问题的两种解法及其应用。二维解法使用dp[i][j]表示前i个物品在容量j时的最大价值,递推公式为dp[i][j]=max(dp[i-1][j], dp[i-1][j-weight[i]]+value[i])。一维解法优化空间复杂度,逆序遍历背包容量。最后展示了416题如何将分割等和子集问题转化为01背包问题,通过判断能否装满sum/2的背包来求解。代码示例展示了两种解法的具体实现和问题转化思路。
2026-02-04 09:46:28
56
原创 代码随想录算法训练营打卡第34天|62.不同路径、63. 不同路径 II
思路:两种好理解的算法,第一种是用动态规划法,当前路径数量等于左边的加上上边的,第二种是数学法,走到终点向左一共n-1步,向下一共m-1步,因此只需要选什么时候向下走,即。思路:利用动态规划法,遇到有障碍的跳过。为了防止溢出,需要不断除以分母。
2026-02-02 12:24:11
72
原创 代码随想录打卡第32天|509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯
思路:可以用递归,也可以用动态规划,dp[i]=dp[i-1]+dp[i-2]。初始条件为dp[1]=1;思路:和斐波那契数列一样,因为一次可以爬两个或者一个楼梯,因此dp[i]=dp[i-1]+dp[i-2]思路:看见时不好想到,最小花费就是选从前一个跳和前两个条的最小值。
2026-01-31 10:45:27
66
原创 代码随想录算法训练营打卡第31天|56. 合并区间、738.单调递增的数字
思路:这道题和之前的区间问题差不多,先要对区间进行排序,以开始从小到大的顺序排序,将第一个区间放入结果,之后如果发现和之前的区间重合则修改区间的末尾,反之则将区间加入结果。思路:先把数字转为字符串方便操作,然后从后往前判断当前数字是否小于前一个数字,如果是则将前一个数字减一,将flag设为当前下标(结束后根据flag位置将后面的全赋值为9)
2026-01-30 14:23:28
107
原创 代码随想录算法训练营打卡第30天|452. 用最少数量的箭引爆气球、435. 无重叠区间、763.划分字母区间
本文介绍了三个区间处理问题的解法:1. 452题用最少箭引爆气球:先按起点排序,比较相邻区间是否重叠,更新最小右边界,否则增加箭数。2. 435题无重叠区间:按终点排序,比较相邻区间重叠情况,删除重叠区间并计数。3. 763题划分字母区间:记录字母最后出现位置,遍历字符串时更新当前区间右边界,当i到达右边界时分割区间。三个问题都采用了贪心算法思想,通过排序和边界比较来解决问题。
2026-01-29 11:02:10
299
原创 代码随想录算法训练营打卡第29天|134. 加油站、135. 分发糖果、860.柠檬水找零、406.根据身高重建队列
本文总结了LeetCode上四个贪心算法题目的解法:1. 加油站问题:暴力法模拟行驶过程,贪心法通过油量差值确定起点;2. 分发糖果:两次遍历分别处理左右相邻关系;3. 柠檬水找零:维护5元和10元数量处理不同面额找零;4. 身高重建队列:先排序后按k值插入。这些解法展示了贪心算法在不同场景下的应用,通过局部最优选择达到全局最优解。
2026-01-28 10:35:50
395
原创 代码随想录算法训练营打卡第28天|122.买卖股票的最佳时机II、55. 跳跃游戏、45.跳跃游戏II、1005.K次取反后最大化的数组和
本文总结了四个LeetCode贪心算法题解:1)股票买卖II通过累加每日正利润实现最大收益;2)跳跃游戏用cover变量追踪可达范围;3)跳跃游戏II通过动态更新cover范围计算最小跳跃次数;4)K次取反通过绝对值排序优先处理负数,剩余次数处理最小元素。每个问题都采用局部最优推导整体最优的贪心策略,代码简洁高效。
2026-01-27 10:33:56
200
原创 代码随想录算法训练营打卡第27天|455.分发饼干、376. 摆动序列、53. 最大子序和
本文介绍了三个贪心算法题目及其解法。1. 分发饼干(455题):通过排序饼干和胃口数组,优先用大饼干满足大胃口,实现最大化分配。2. 摆动序列(376题):通过比较相邻元素差值,删除单调节点保留摆动节点,计算最长摆动序列长度。3. 最大子序和(53题):提供暴力法和贪心法两种解法,贪心法通过舍弃负数和来寻找最大连续子数组和。每个问题都给出了对应的代码实现和解题思路分析。
2026-01-26 11:11:47
254
原创 代码随想录算法训练营打卡第25天|491.递增子序列、46.全排列、47.全排列 II
思路:如果path里面的数大于两个就添加到结果中。创建一个set集合去重,如果path不为空,且当前元素小于path尾部元素或者当前元素已经存在则跳过当前元素。思路:本题含有重复元素,还需要和之前的结合去重,如果本层使用过当前元素则跳过,要注意这个方法判断需要排序。思路:利用used数组判断当前元素在本树枝是否使用过,使用过则跳过,for循环从0到n。
2026-01-24 17:23:56
165
原创 代码随想录算法训练营打卡第24天|93.复原IP地址、78.子集、90.子集II
本文介绍了三个回溯算法问题:复原IP地址、子集和子集II。复原IP地址通过递归和回溯判断合法IP段并插入分隔符;子集问题提供了两种解法,一种是控制递归深度,另一种是收集所有路径;子集II在子集基础上增加了去重处理,通过排序和标记数组避免重复子集。三种问题都展示了回溯算法的典型应用,其中子集II的第二种解法效率更高,值得推荐。
2026-01-23 11:02:35
318
原创 代码随想录算法训练营打卡第23天|39. 组合总和、40.组合总和II、131.分割回文串
思路:利用startIndex判断是否终止循环,如果startIndex大于等于字符串长度就终止,在for循环中判断当前起始位置到i的字符是否为回文,是则添加到结果,反之递归。思路:和组合的思路一样,本题无数量要求,但是解集不能包含重复的组合,因此要加上startIndex。同一层的相同元素不可以重复,但是不同层的可以,因此我们要加上一个used数组。思路:和上一题的区别是。
2026-01-22 10:59:58
181
原创 代码随想录算法训练营打卡第22天|77. 组合、216.组合总和III、17.电话号码的字母组合
本文介绍了三道回溯算法组合问题的解法。1. 77题组合:通过树形结构回溯,控制宽度和深度,优化时进行剪枝操作;2. 216题组合总和III:在1-9范围内找k个数的和为n的组合;3. 17题电话号码字母组合:建立数字-字母映射表,回溯生成所有可能的字母组合。每道题都提供了详细的解题思路、代码实现和优化方法,重点分析了回溯过程中的处理、递归和撤销操作。这些解法展示了回溯算法在组合问题中的典型应用模式。
2026-01-21 11:02:31
291
原创 代码随想录算法训练营打卡第21天|669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树
本文总结了三个二叉搜索树相关算法题解:1.修剪二叉搜索树(669题):递归处理节点,当节点值超出范围时,保留符合条件的子树;2.有序数组转二叉搜索树(108题):通过二分法选取中间节点为根,递归构建左右子树;3.二叉搜索树转累加树(538题):采用右-中-左遍历顺序,累加前驱节点值。三题均使用递归解法,时间复杂度为O(n)。
2026-01-20 11:46:52
168
原创 代码随想录算法训练营打卡第20天|235. 二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点
思路:删除节点较为复杂,遇到空节点返回,遇到叶子节点直接删除,左子树为空右子树不为空则将右子树作为当前节点,反之也是,遇到左右子树都不为空的将左子树移到右子树最左边节点的左孩子。如果遇到空节点就返回,如果当前节点的值大于q和p则递归查找左子树,反之递归查找右子树,遇到在区间内的节点即为最近公共祖先。思路:可以按照二叉树求最近公共祖先的思路写,也可以结合二叉搜索树的性质做这道题,两个节点的祖先在两个节点区间之内。思路:根据二叉搜索树的性质,判断节点值的大小,插入合适的位置。
2026-01-20 10:36:46
151
原创 代码随想录算法训练营打卡第18天|530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先
本文总结了二叉搜索树和二叉树的三道经典题目解法。对于530题求二叉搜索树最小绝对差,提供了两种方法:中序遍历转为有序数组后计算最小差值,以及双指针递归法直接比较相邻节点。501题求众数给出map统计法和利用中序有序特性的双指针法。236题求最近公共祖先采用后序遍历,通过判断左右子树返回结果确定祖先节点。核心思路都是利用二叉搜索树的有序性或二叉树遍历特性,通过递归或指针操作高效解决问题。
2026-01-19 11:57:19
162
原创 代码随想录算法训练营打卡第17天| 654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树
本文介绍了四道二叉树相关算法题的解法:1. 654.最大二叉树:通过递归找到数组最大值作为根节点,分割左右子数组递归构建。2. 617.合并二叉树:递归合并两棵树,若节点为空则返回另一棵树,否则节点值相加;迭代法使用队列处理。3. 700.二叉搜索树搜索:利用BST特性递归搜索目标值。4. 98.验证二叉搜索树:通过中序遍历检查是否严格递增来判断BST有效性,提供递归和迭代两种解法。各题均给出代码实现,涉及递归、迭代等核心思想。
2026-01-19 10:38:16
309
原创 代码随想录算法训练营打卡第16天| 找树左下角的值 、路径总和、从中序与后序遍历序列构造二叉树
本文介绍了三个二叉树相关问题的解法:1. 找树左下角的值(513题):提供递归法和层序遍历两种解法,递归法通过记录最大深度和对应值实现,层序遍历记录每层第一个节点值;2. 路径总和(112题):使用递归法,在遍历过程中递减目标值,当到达叶子节点且目标值为0时返回true;3. 从中序与后序遍历构造二叉树(106题):通过后序末节点确定根节点,划分中序序列为左右子树,递归构建二叉树。所有解法均包含详细代码实现。
2026-01-18 13:35:52
207
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅