
算法训练营
文章平均质量分 77
近景_
这个作者很懒,什么都没留下…
展开
-
Day66 算法训练营
97.小明逛公园(Floyd)原创 2025-04-15 15:50:01 · 133 阅读 · 0 评论 -
Day65 算法训练营
负权回路是指一系列道路的总权值为负,这样的回路使得通过反复经过回路中的道路,理论上可以无限地减少总成本或无限地增加总收益。要解决负权回路的问题,在对每条边进行n-1次松弛后,若题目中没有负权回路,则在第n-1次松弛后再进行松弛,minDist数组也不会发生变化,若存在负权回路,则在第n次松弛minDist数组就会变化,故朴素版思路可以进行n次松弛,n-1轮松弛照样进行,第n次松弛判断minDist[n]是否发生变化,若发生变化,则跳出循环输出"circle"即可,否则照常输出。原创 2025-04-15 13:35:05 · 661 阅读 · 0 评论 -
Day64 算法训练营
遍历开始前,先将源点初始化成Pair类并加入队列中,然后开始遍历队列,获取队头元素,若该元素未被访问,则标记该节点已被访问,然后开始遍历从该节点引出的边,若边所链接的目标节点未被访问,且队头节点经过该边到达目标节点的距离小于minDist数组中记录的源点到目标节点的最近距离,则更新此最近距离,并将目标节点初始化为Pair类加入到队列中,直至队列为空,若minDist[n]未被遍历赋值,说明不存在一条边,使得源点到终点,输出-1,否则,输出minDist[n]即可。原创 2025-04-14 14:23:04 · 320 阅读 · 0 评论 -
Day63 算法训练营
dijkstra算法实际上是求加权图中从起始节点到最终节点的最短路径问题,算法思想和prim类似,都是在遍历节点时,找到距离源点最近且未被访问过的节点,标记该节点被访问过,更新非访问节点到源点的距离(即更新minDist)数组,遍历结束后,若minDist[end]被更新过,说明存在从源点到终点的一条最短路径,将最短路径权值和输出即可,否则,说明不存在一条源点到重点的最短路径,输出-1。117.软件构建(拓扑排序);47.参加科学大会(dijkstra)在更新minDist数组时,要注意判断条件,需要。原创 2025-04-10 14:37:32 · 232 阅读 · 0 评论 -
Day62 算法训练营
58.寻宝(Prim算法);58.寻宝(Kruskal算法)原创 2025-04-07 12:03:04 · 233 阅读 · 0 评论 -
Day61 算法训练营
【代码】Day61 算法训练营。原创 2025-04-04 21:35:52 · 390 阅读 · 0 评论 -
Day59 算法训练营
可以定义并查集类,此类为模板类,遇到可以用并查集解决的问题,都可以调用此类。107.寻找存在的路径。原创 2025-04-03 14:15:37 · 228 阅读 · 0 评论 -
Day58 算法训练营
方法二:从一个陆地节点开始,判断向上方向和向左方向是否为陆地,若为陆地,说明当前陆地节点和方向陆地节点是两个相邻节点,相邻节点有2条边是重叠的,故最后应该将所有的陆地节点 * 4算出总边长数,再减去重叠的节点边长数(重叠陆地节点 * 2),遍历结束将该结果返回即可。如果是处理当前访问的节点,当前节点如果是true,说明已经访问过该节点,直接终止本层递归,如果不是true,则将此节点置为true,开始本层递归。本题有两种思路可以AC,但Java语言在平台上提交是时间超限,C++就没问题,都是一样的思路。原创 2025-04-02 16:54:24 · 984 阅读 · 0 评论 -
Day57 算法训练营
实际上本题的优化方案十分巧妙,只需要dfs遍历图中的边缘节点即可,从边缘节点渗透到全图。101.孤岛的总面积;104.建造最大岛屿。同样从第二组边界的边上节点 逆流而上,将遍历过的节点也标记上。从第一组边界上的节点 逆流而上,将遍历过的节点都标记上。原创 2025-04-01 17:26:06 · 535 阅读 · 0 评论 -
Day56 算法训练营
99.岛屿数量(深搜);99.岛屿数量(广搜);100.岛屿的最大面积。原创 2025-03-31 15:14:25 · 279 阅读 · 0 评论 -
Day55 算法训练营
【代码】Day55 算法训练营。原创 2025-03-31 12:26:12 · 149 阅读 · 0 评论 -
Day53 算法训练营
84.柱状图中最大的矩形。原创 2025-03-27 17:52:14 · 617 阅读 · 0 评论 -
Day52 算法训练营
实际上可以将两个nums数组拼接在一起,在循环过程中,将下标取余size,相当于循环了两边nums数组,也是可以的。496.下一个更大元素I;503.下一个更大元素II。原创 2025-03-26 14:46:43 · 480 阅读 · 0 评论 -
Day51 算法训练营
516.最长回文子序列。原创 2025-03-25 11:46:24 · 232 阅读 · 0 评论 -
Day50 算法训练营
115.不同的子序列;583.两个字符串的删除操作;原创 2025-03-24 13:13:10 · 526 阅读 · 0 评论 -
Day49 算法训练营
1143.最长公共子序列;1035.不相交的钱;原创 2025-03-21 13:19:22 · 282 阅读 · 0 评论 -
Day48 算法训练营
300.最长递增子序列;674.最长连续递增序列;718.最长重复子数组。原创 2025-03-20 17:18:41 · 296 阅读 · 0 评论 -
Day46 算法训练营
本题和之前的股票类题目,区别在于加上了冷冻期,但本题没有限制最多可以交易几次,故无需针对限制的交易次数设置状态,而只需要针对冷冻期设置4个状态:0(保持购入状态),1(保持卖出状态),2(今天卖出状态),3(冷冻期状态);之所以本题要设置2(今天卖出状态),是因为冷冻期状态的前一天一定是今天卖出状态,而不是保持卖出状态,因为这样描述并不准确。188.买卖股票的最佳时机Ⅳ;309.最佳买卖股票时机含冷冻期;714.买卖股票的最佳时机含手续费。原创 2025-03-19 14:01:29 · 357 阅读 · 0 评论 -
Day45 算法训练营
本题和上题又有区别,本题限制了购入和卖出次数,来回最多2次,定义二维dp数组,分为4种状态:第一次持有股票,第一次不持有股票,第二次持有股票,第二次不持有股票。可以定义二维dp数组,第一维度对应第i天的股票价格,第二维度中只有两个值,0代表持有当天股票所得到的最大利润,1代表不持有当天股票所得到的最大利润。中 i表示第i天,j为 [0 - 4] 五个状态,, 那么可以由两个状态推出来。应该选所得现金最大的,所以。, 也可以由两个状态推出来。如果第i天不持有股票即。如果第i天持有股票即。原创 2025-03-18 14:49:11 · 403 阅读 · 0 评论 -
Day44 算法训练营
213.打家劫舍II;337.打家劫舍III。原创 2025-03-17 14:16:20 · 258 阅读 · 0 评论 -
Day43 算法训练营
279.完全平方数;原创 2025-03-14 15:25:17 · 390 阅读 · 0 评论 -
Day42 算法训练营
放物品i:背包空出物品i的容量后,背包容量为j - weight[i],dp[i]【j - weight[i]】 为背包容量为j - weight[i]且不放物品i的最大价值,那么dp[i]【j - weight[i]】 + value[i] (物品i的价值),就是背包放物品i得到的最大价值。二维数组初始化时,若j < weight[0]时,dp[0]【j】应该是0,因为此时背包容量比编号0的物品容量还小;518.零钱兑换II;不放物品i:背包容量为j,里面不放物品i的最大价值是dp[i - 1]【j】原创 2025-03-13 13:51:04 · 627 阅读 · 0 评论 -
Day41 算法训练营
第一行dp[0]【j】初始化时,只有背包容量为物品0容量的时候,方法为1,表示正好装满,其他情况下,要么装不满,要么装不下,所以dp[0]【nums[0]】=1,其余均为0。第一列dp[i]【0】中都是只有1种方法,即放0件物品i,但存在物品0的重量为0的情况,故存在几个重量为0的物品,就应将指定的dp数组元素值置为2的几次方。递推公式:dp[i]【j】=dp[i - 1]【j】+dp[i - 1]【j - nums[i]】:即背包容量为j,里面不放物品i,装满有dp[i - 1]【j】中方法。原创 2025-03-12 15:39:18 · 468 阅读 · 0 评论 -
Day39 算法训练营
dp数组初始化重点考虑第一行和第一列,第一列中j=0,表示此时背包容量为0,不能装下任何物品,故第一列的dp数组元素值置为0,第一行中i=0,表示此时只有物品0这一个物品,当背包容量刚好等于物品0时,此后直至背包的最大容量,背包内的最大价值均为物品0的价值,将dp数组元素值赋值为value[0],而当背包容量不足物品0的重量时,赋值为0。若可以将物品i放入,则当前dp数组元素值取dp[i - 1】[j]和dp[i - 1】[j - weight[i]] + value[i]中的较大者。01.背包问题二维;原创 2025-03-11 18:27:11 · 365 阅读 · 0 评论 -
Day38 算法训练营
在这m + n - 2 步中,一定有 m - 1 步是要向下走的,不用管什么时候向下走那么有几种走法呢?可以转化为,给你m + n - 2个不同的数,随便取m - 1个数,有几种取法。那么这就是一个组合问题了。本题按照随想录的思路,可以在第一行和第一列的dp元素值赋值为1时,判断若遇到了路障位置,则终止赋值,因为第一行或第一列障碍后的位置必定无法到达。随想录上提供了数论的方法,即一共m,n的话,无论怎么走,走到终点都需要 m + n - 2 步。原创 2025-03-11 13:47:19 · 286 阅读 · 0 评论 -
Day37 算法训练营
509.斐波那契数;746.使用最小花费爬楼梯。原创 2025-03-10 20:58:11 · 297 阅读 · 0 评论 -
Day36 算法训练营
738.单调递增的数字。原创 2025-03-10 13:59:25 · 200 阅读 · 0 评论 -
Day35 算法训练营
452.用最少数量的箭引爆气球;435.无重叠区间;763.划分字母区间。原创 2025-03-02 12:35:09 · 278 阅读 · 0 评论 -
Day34 算法训练营
一旦[0,i] 区间和为负数,起始位置就可以是i+1,并且没有可能 [0,i] 区间 选某一个作为起点,累加到 i这里 curSum会小于零,理由是:区间和1+区间和2 < 0,而区间和2 > 0,则区间和1一定小于0,那么早在区间和1末元素的下一位元素就应该作为起始节点了。若剩余油量的所有和值小于0,说明加的油要少于耗掉的油,那么无论从哪里出发,都无法完成题设的要求,返回-1;先解决一个维度:身高,再解决另一个维度:前面大于等于本人身高的有几个人。账单是20的情况,为什么要优先消耗一个10和一个5呢?原创 2025-03-02 10:15:28 · 904 阅读 · 0 评论 -
Day33 算法训练营
相当于(prices[3] - prices[2]) + (prices[2] - prices[1]) + (prices[1] - prices[0])122.买卖股票的最佳时机II;45.跳跃游戏II;1005.K次取反后最大化的数组和。假如第 0 天买入,第 3 天卖出,那么利润为:prices[3] - prices[0]于是只需要累加每天利润数组中的正值即可。可以直接求出数组的所有元素和。本题还可将最终利润进行分解。原创 2025-02-28 11:21:43 · 606 阅读 · 0 评论 -
Day32 算法训练营
【代码】Day32 算法训练营。原创 2025-02-27 11:11:57 · 364 阅读 · 0 评论 -
Day31 算法训练营
本题和上题的区别在于,本题允许初始数组中有重复元素,画出回溯树,区分树层上不能有重复元素,即树层上要去重,而树枝上可以有重复元素,因此不能乱棍打死,不得不用used标志数组了,注意区分,树层上去重,要求use[i - 1] == false说明不是从树枝上来到此处,而树枝上要求use[i] == false即当前元素未使用,才可以进一步递归,递归结束后返回result即可。491.递增子序列;原创 2025-02-26 11:00:49 · 338 阅读 · 0 评论 -
Day30 算法训练营
原因:排序后的数组元素从小到大排列,i控制的是同层树节点,若该层上一次(i - 1)访问的树节点和该层当前访问(i)的树节点相等,说明此子集结果已在之前访问过程中收集过,则跳过即可。93.复原IP地址;原创 2025-02-25 15:46:35 · 396 阅读 · 0 评论 -
Day29 算法训练营
为什么 used[i - 1] == false 就是同一树层呢,因为同一树层,used[i - 1] == false 才能表示,当前取的 candidates[i] 是从 candidates[i - 1] 回溯而来的。更精明的剪枝操作,是将原数组进行排序,然后在for循环处判断下一层会不会sum值大于了target,若已知下一层节点的sum值会大于target,则无需进入下一层递归再判断后返回,直接不进入递归即可,完成剪枝操作。40.组合总和II;原创 2025-02-24 20:20:33 · 558 阅读 · 0 评论 -
Day28 算法训练营
回溯问题本质上还是树的搜索问题,本题无法使用纯暴力方法解决,因为有k的限制,需要k层for循环去暴力实现,这是纯暴力方法无法实现的,遂采用回溯的思想,递归k层,每次递归都表明了选取了一个数,使用path变量存储方法的树节点,若path长度刚好等于k,则说明找到了满足要求的组合,加入到结果集合当中,直至遍历完所有元素。按照回溯的模板代码,for循环控制当前层的遍历,递归层数控制每次选取的元素,直至path的长度与输入的digits长度相同,代表已找到当前组合,加入到result中即可。原创 2025-02-23 21:33:33 · 316 阅读 · 0 评论 -
Day27 算法训练营
当数组长度为偶数时,根节点值应该取中间元素,此时中间元素有两个,实际上取哪个都可以,取不同的中间元素作为根节点值对应了构造的两种情况的二叉平衡树,因此最终构造结果并不唯一。669.修剪二叉搜索树;108.将有序数组转换为二叉搜索树;538.把二叉搜索树转换为累加树。本题既可以使用复制数组构造二叉搜索树,也可以使用定义数组边界值来构造二叉搜索树;原创 2025-02-14 21:39:49 · 261 阅读 · 0 评论 -
Day20 算法训练营
235.二叉搜索树的最近公共祖先;701.二叉搜索树中的插入操作;450.删除二叉搜索树中的节点。原创 2025-02-14 16:28:37 · 371 阅读 · 0 评论 -
Day18 算法训练营
使用回溯的思路,若左子树和右子树的返回值均不为空,说明当前节点就是p和q的最近公共祖先,若左子树不为空,但右子树为空,说明当前节点不是p和q的公共祖先,需要将左子树返回上一层祖先,若左子树为空,但右子树不为空,需要将右子树返回上一层祖先;在递归函数有返回值的情况下:如果要搜索一条边,递归函数返回值不为空的时候,立刻返回,如果搜索整个树,直接用一个变量left、right接住返回值,这个left、right后序还有逻辑处理的需要,也就是后序遍历中处理中间节点的逻辑(也是回溯)530.二叉搜索树的最小绝对差;原创 2025-02-05 22:39:07 · 314 阅读 · 0 评论 -
Day17 算法训练营
654.最大二叉树;617.合并二叉树;700.二叉搜索树中的搜索;98.验证二叉搜索树;原创 2025-02-03 22:05:14 · 235 阅读 · 0 评论 -
Day16 算法训练营
513.找树左下角的值;113.路径总和II;106.从中序与后序遍历序列构造二叉树;105.从前序与中序遍历序列构造二叉树。为何只能将paths的复制数组tempPaths添加入result中,而不能直接将paths添加入result中?接口的类,可以直接通过构造函数来复制列表。原创 2025-02-02 22:41:16 · 459 阅读 · 0 评论