- 博客(96)
- 资源 (1)
- 收藏
- 关注
原创 Day58 算法训练营
方法二:从一个陆地节点开始,判断向上方向和向左方向是否为陆地,若为陆地,说明当前陆地节点和方向陆地节点是两个相邻节点,相邻节点有2条边是重叠的,故最后应该将所有的陆地节点 * 4算出总边长数,再减去重叠的节点边长数(重叠陆地节点 * 2),遍历结束将该结果返回即可。如果是处理当前访问的节点,当前节点如果是true,说明已经访问过该节点,直接终止本层递归,如果不是true,则将此节点置为true,开始本层递归。本题有两种思路可以AC,但Java语言在平台上提交是时间超限,C++就没问题,都是一样的思路。
2025-04-02 16:54:24
975
原创 Day57 算法训练营
实际上本题的优化方案十分巧妙,只需要dfs遍历图中的边缘节点即可,从边缘节点渗透到全图。101.孤岛的总面积;104.建造最大岛屿。同样从第二组边界的边上节点 逆流而上,将遍历过的节点也标记上。从第一组边界上的节点 逆流而上,将遍历过的节点都标记上。
2025-04-01 17:26:06
534
原创 Day52 算法训练营
实际上可以将两个nums数组拼接在一起,在循环过程中,将下标取余size,相当于循环了两边nums数组,也是可以的。496.下一个更大元素I;503.下一个更大元素II。
2025-03-26 14:46:43
479
原创 Day46 算法训练营
本题和之前的股票类题目,区别在于加上了冷冻期,但本题没有限制最多可以交易几次,故无需针对限制的交易次数设置状态,而只需要针对冷冻期设置4个状态:0(保持购入状态),1(保持卖出状态),2(今天卖出状态),3(冷冻期状态);之所以本题要设置2(今天卖出状态),是因为冷冻期状态的前一天一定是今天卖出状态,而不是保持卖出状态,因为这样描述并不准确。188.买卖股票的最佳时机Ⅳ;309.最佳买卖股票时机含冷冻期;714.买卖股票的最佳时机含手续费。
2025-03-19 14:01:29
355
原创 Day45 算法训练营
本题和上题又有区别,本题限制了购入和卖出次数,来回最多2次,定义二维dp数组,分为4种状态:第一次持有股票,第一次不持有股票,第二次持有股票,第二次不持有股票。可以定义二维dp数组,第一维度对应第i天的股票价格,第二维度中只有两个值,0代表持有当天股票所得到的最大利润,1代表不持有当天股票所得到的最大利润。中 i表示第i天,j为 [0 - 4] 五个状态,, 那么可以由两个状态推出来。应该选所得现金最大的,所以。, 也可以由两个状态推出来。如果第i天不持有股票即。如果第i天持有股票即。
2025-03-18 14:49:11
395
原创 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
625
原创 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
462
原创 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
363
原创 Day38 算法训练营
在这m + n - 2 步中,一定有 m - 1 步是要向下走的,不用管什么时候向下走那么有几种走法呢?可以转化为,给你m + n - 2个不同的数,随便取m - 1个数,有几种取法。那么这就是一个组合问题了。本题按照随想录的思路,可以在第一行和第一列的dp元素值赋值为1时,判断若遇到了路障位置,则终止赋值,因为第一行或第一列障碍后的位置必定无法到达。随想录上提供了数论的方法,即一共m,n的话,无论怎么走,走到终点都需要 m + n - 2 步。
2025-03-11 13:47:19
285
原创 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
896
原创 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
604
原创 Day31 算法训练营
本题和上题的区别在于,本题允许初始数组中有重复元素,画出回溯树,区分树层上不能有重复元素,即树层上要去重,而树枝上可以有重复元素,因此不能乱棍打死,不得不用used标志数组了,注意区分,树层上去重,要求use[i - 1] == false说明不是从树枝上来到此处,而树枝上要求use[i] == false即当前元素未使用,才可以进一步递归,递归结束后返回result即可。491.递增子序列;
2025-02-26 11:00:49
337
原创 Day30 算法训练营
原因:排序后的数组元素从小到大排列,i控制的是同层树节点,若该层上一次(i - 1)访问的树节点和该层当前访问(i)的树节点相等,说明此子集结果已在之前访问过程中收集过,则跳过即可。93.复原IP地址;
2025-02-25 15:46:35
393
原创 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
555
原创 Day28 算法训练营
回溯问题本质上还是树的搜索问题,本题无法使用纯暴力方法解决,因为有k的限制,需要k层for循环去暴力实现,这是纯暴力方法无法实现的,遂采用回溯的思想,递归k层,每次递归都表明了选取了一个数,使用path变量存储方法的树节点,若path长度刚好等于k,则说明找到了满足要求的组合,加入到结果集合当中,直至遍历完所有元素。按照回溯的模板代码,for循环控制当前层的遍历,递归层数控制每次选取的元素,直至path的长度与输入的digits长度相同,代表已找到当前组合,加入到result中即可。
2025-02-23 21:33:33
310
原创 Day27 算法训练营
当数组长度为偶数时,根节点值应该取中间元素,此时中间元素有两个,实际上取哪个都可以,取不同的中间元素作为根节点值对应了构造的两种情况的二叉平衡树,因此最终构造结果并不唯一。669.修剪二叉搜索树;108.将有序数组转换为二叉搜索树;538.把二叉搜索树转换为累加树。本题既可以使用复制数组构造二叉搜索树,也可以使用定义数组边界值来构造二叉搜索树;
2025-02-14 21:39:49
254
原创 Day18 算法训练营
使用回溯的思路,若左子树和右子树的返回值均不为空,说明当前节点就是p和q的最近公共祖先,若左子树不为空,但右子树为空,说明当前节点不是p和q的公共祖先,需要将左子树返回上一层祖先,若左子树为空,但右子树不为空,需要将右子树返回上一层祖先;在递归函数有返回值的情况下:如果要搜索一条边,递归函数返回值不为空的时候,立刻返回,如果搜索整个树,直接用一个变量left、right接住返回值,这个left、right后序还有逻辑处理的需要,也就是后序遍历中处理中间节点的逻辑(也是回溯)530.二叉搜索树的最小绝对差;
2025-02-05 22:39:07
309
原创 Day16 算法训练营
513.找树左下角的值;113.路径总和II;106.从中序与后序遍历序列构造二叉树;105.从前序与中序遍历序列构造二叉树。为何只能将paths的复制数组tempPaths添加入result中,而不能直接将paths添加入result中?接口的类,可以直接通过构造函数来复制列表。
2025-02-02 22:41:16
457
原创 Day15 算法训练营
以后写树的代码,只要关注传入的root节点,不要去想节点往左移怎么样或者往右移怎么样,只考虑当前节点的左子树怎么样,右子树怎么样,最后需要返回什么样的结果,关注太多容易陷入循环;此题要注意的是左叶子的判断条件,然后计算当前节点左子树中的左叶子节点累加和,当前节点右子树中的右叶子节点累加和,最后累加返回结果。求普通二叉树的节点个数,可以递归求出左子树的节点个数,递归求出右子树的节点个数,然后左子树的节点个数和右子树的节点个数相加,再累加上一个根节点,返回即可。404.左叶子之和;(2<<1) 相当于2^2。
2025-01-26 22:43:56
688
原创 Day11 算法训练营
在编写代码时,要注意滑动窗口中存放的数组元素下标满足在[i - k + 1, i]区间,双端队列中存放的也是数组元素下标,方便判断将不满足区间要求的队头元素出队,另外,判断待入队元素前是否比该元素小的数时,要注意是从队尾元素开始比较,从队尾出队后,再将待入队元素从队尾入队。随想录的思路是利用Map和优先级队列,构建小顶堆,当队内元素个数大于k时,直接出队,保持队内只有k个元素,则此k个元素即为出现频率最小的元素,最后获取后返回即可。150.逆波兰表达式求值;239.滑动窗口最大值;347.前K个高频元素。
2025-01-23 12:30:22
628
Web课程设计之学生成绩管理系统实现源码
2022-06-13
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人