- 博客(49)
- 收藏
- 关注
原创 代码随想录算法营Day63,64 | 软件构建,参加科学大会,城市间货物运输 I
某个大型软件项目的构建系统拥有 N 个文件,文件编号从 0 到 N - 1,在这些文件中,某些文件依赖于其他文件的内容,这意味着如果文件 A 依赖于文件 B,则必须在处理文件 A 之前处理文件 B (0 <= A, B <= N - 1)。请编写一个算法,用于确定文件处理的顺序。这是典型的拓扑排序题目,准备一个indegree数组记录每个文件的依赖,再准备一个字典存储每个文件被哪些文件依赖。
2025-03-14 11:30:35
283
原创 代码随想录算法营Day62 | 寻宝(Prim算法,kruskal算法)
在世界的某个区域,有一些分散的神秘岛屿,每个岛屿上都有一种珍稀的资源或者宝藏。国王打算在这些岛屿上建公路,方便运输。不同岛屿之间,路途距离不同,国王希望你可以规划建公路的方案,如何可以以最短的总公路距离将 所有岛屿联通起来(注意:这是一个无向图)。给定一张地图,其中包括了所有的岛屿,以及它们之间的距离。以最小化公路建设长度,确保可以链接到所有岛屿。
2025-03-11 11:31:26
417
原创 代码随想录算法营Day58 | 字符串接龙, 有向图的完全可达性,岛屿的周长
这题使用广搜。首先我们需要确定每个字符串都是由begin字符串通过多少step生成的,每个step就是每一层。使用judge函数来确定每个字符串所用的step。
2025-03-06 11:53:44
468
原创 代码随想录算法营Day53 | 42. 接雨水, 84. 柱状图中最大的矩形
这道题如果按列来算,我们知道该列所能接的水取决于左右两边列的最小高度,我们只需要知道该列左边的最大值以及右边的最大值,然后取这俩个值的最小值然后减去当前列的高度,就可以获得该列可以接的最多雨水的值。这道题用单调栈的方式,栈内保持一个单调递增,如果遇到递减的情况,则开始逐一出栈,然后计算最大面积。不过在这之前我们需要在heights数组的左右两端各加一个元素0,以确保能将整个数组的情况包含进去。
2025-03-05 21:51:44
525
原创 代码随想录算法营Day57 | 孤岛的总面积,沉没孤岛,水流问题,建造最大岛屿
这道题先将靠近边界线上的岛屿都放置为0,然后再用深度或者广度搜索算法去计算剩余的孤岛总面积。
2025-03-05 13:33:21
831
原创 代码随想录算法营Day55 | 所有可达路径
给定一个有 n 个节点的有向无环图,节点编号从 1 到 n。请编写一个函数,找出并返回所有从节点 1 到节点 n 的路径。每条路径应以节点编号的列表形式表示。这道题用深度优先的回溯算法即可。
2025-03-04 17:48:09
293
原创 代码随想录算法营Day56 | 岛屿数量(深度+广度),岛屿的最大面积
这道题要求在有1,0 组成的m x n的矩阵中找到由1组成的岛屿数量。使用深度或者广度优先算法来进行解题。
2025-03-04 16:56:51
222
原创 代码随想录算法营Day52 | 739. 每日温度,496. 下一个更大元素 I,503. 下一个更大元素 II
栈里面呈单调递减的状态,只有当入栈的元素大于栈顶的时候,我们判断栈顶的元素是否存在于nums1数组中。如果在我们就更新结果数组。这道题使用单调栈,每当当前温度大于栈顶的温度时就更新结果数组,并且pop栈。若当前小于等于栈顶的值时便直接入栈。栈内保存的是温度的索引。这道题变成循环数组,逻辑与每日温度是同一个逻辑。只不过需要遍历两遍。
2025-02-28 11:45:49
301
原创 代码随想录算法营Day50 | 115. 不同的子序列,583. 两个字符串的删除操作,72. 编辑距离
这题与上面思路类似,如果两个子字符串的末尾处相等,那么说明此时的i与j索引处不需要有额外的操作,如果不同那么说这里的两个字符需要操作,那么就取都删除,还是删除其中一个字符的操作数最小的值。
2025-02-27 13:16:15
294
原创 代码随想录算法营Day49 |1143. 最长公共子序列,1035. 不相交的线,53. 最大子数组和,392. 判断子序列
这题与最长公共子数组是同一个逻辑,dp[i][j] 记录text1中0到i-1与text2中0到j-1范围内最长的字符串。这题与前文一模一样的逻辑,也是找公共的部分。
2025-02-26 12:21:24
474
原创 代码随想录算法营Day48 | 300. 最长递增子序列,674. 最长连续递增序列,718. 最长重复子数组
这道题初始化有一个一维数组,数组的索引表示从0到当前索引时nums中最长的递增子序列的长度。第一个for遍历每一个索引,第二个for遍历从0到当前索引时,更新dp数组中当前索引时最长的递增子序列的长度。dp[i][j]存储nums1[i-1] 与nums2[j-1]之间最长的公共数字的长度,res记录全局最长的公共数字长度。这道题要求连续,即不可以进行删除操作,那么我们只需要在当前值小于前一个值时记录一下当千最大的递增连续长度是多少即可。
2025-02-24 14:23:12
223
原创 代码随想录算法营Day46 | 188. 买卖股票的最佳时机 IV,309. 买卖股票的最佳时机含冷冻期,714. 买卖股票的最佳时机含手续费
这题多了一个冷冻期,也就是卖出去股票的第二天不可以买入股票。总共就两个状态一个是持有股票,一个是不持有股票。持有股票这个状态会受到冷冻期的影响及前一天持有的股票的状态以及大前天不持有股票而在今天买入了股票的状态。不持有股票的状态不受冷冻期影响。这道题就相当于买卖股票的最佳时机lll的进阶版,买卖次数变为k。那其实只要在循环的时候更改一下,奇数次都是持有的最大收益,偶数次都是不持有时的最大收益。这题就多了个手续费(在卖出股票的时候再减去手续费就是了,整体思路与经典买卖股票一样。
2025-02-23 18:07:17
456
原创 代码随想录算法营Day45 | 121. 买卖股票的最佳时机,122. 买卖股票的最佳时机 II,123. 买卖股票的最佳时机 IIl
这题没啥说的,每次当前的price小于最新的price的时候则更改最新的price为当前的price,如果大于则更新结果值为max((当前值-最新值),结果值)这道题之前是用贪心的思路去做,如今若果是用动规的方式,我们先初始化一个dp数组,每个元素为一个[0,0]。
2025-02-21 16:41:35
422
原创 代码随想录算法营Day44 | 198. 打家劫舍,213. 打家劫舍 II,337. 打家劫舍 III
这样的变形其实只要考虑第一个房子偷与被偷的两种情况,取这两种情况当中的最大值。这题我用了两个dp数组,一个记录第一个房子被偷的最大值,一个记录第一个房子不被偷的最大值。先处理左右节点,再根据左右节点的情况再处理当前节点。最后状态放回两个值,一个是偷当前节点的最大值,一个是不偷当前节点的最大值。这道题要求不能偷相邻的房子,那么它的动态转移公式就是dp[i] = max(dp[i-1],dp[i-2]+nums[i])即当前索引能抢的最大值就是前一个索引的值与i-2的索引的值加上当前金额的最大值。
2025-02-20 11:17:55
761
原创 代码随想录算法营Day43 | 518. 零钱兑换 II,377. 组合总和 Ⅳ,爬楼梯(进阶版)
这道题问有多少种方式可以组成指定的amount,那么先初始化dp数组。长度为amount+1,值为0.将dp[0]的值设为1。接下来遍历所有的硬币,而后遍历背包,累加dp[i]的方法数。具体实现如下这道题的要求与上题类似,不过他求的是排列数量,同样的数组内容但不同的位置即不同的排列。那么这里的双for循环就与上题的反一下,先遍历背包,再遍历物品。
2025-02-19 19:05:17
424
原创 代码随想录算法营Day42 | 322. 零钱兑换,279. 完全平方数,139. 单词拆分
这道题先遍历物品也就是每个不同的硬币,然后遍历该硬币面值到目标值的dp数组,状态转移公式为dp[i] = min(dp[i],dp[i-coin]+1)这个背包的大小就是这个目标数,而物品则是每个小于等于该数平方根的所有数。
2025-02-18 20:47:17
342
原创 代码随想录算法营Day41 | 1049. 最后一块石头的重量 II,494. 目标和,474. 一和零
这题就是将数组中的石头分成重量尽量相等的两组石头以确保最后剩下的石头的重量最小。那么转换成背包问题,背包的容量就是石头总重量的一半,物品就是每个石头。
2025-02-17 14:51:16
401
原创 代码随想录算法营Day39 | 416. 分割等和子集
这题换句话说就是是否能找出一个子集,使这个子集的总和等于数组总和的一半,数组里每个元素只能选一次。我们确立一个dp数组,长度为数组总和的half+1,内容为False。索引表示和,索引里的内容表示该数是否能由数组里的元素构成。第一层循环表示选择该数组中的某个数,第二层循环判断加上该数字后能组成的子集和。
2025-02-15 19:53:55
325
原创 代码随想录算法营Day38 | 62. 不同路径,63. 不同路径 II,343. 整数拆分,96. 不同的二叉搜索树
这个动态规划的初始状态是第一行和第一列的格子的值都是1,因为机器人只能向右走一格或者向下走一格,所以第一行和第一列的格子的不同路径数只能是1.而其他格子的路径数取决于每个格子的正上方和左边两个格子的路径数之和,即状态转移公式为。这题分析,当n为1的时候,只有1种,当n为2的时候,有2种,当n为3的时候,总共可以有5种。在进行状态转移的时候也只更新非障碍物格子的值即可。是因为这个数所拆出来的正整数的最大乘积未必有他自身大,所以我们需要判断是直接取这个数本身还是dp记录的该数所拆出来的正整数的最大乘积。
2025-02-14 17:13:32
1038
原创 代码随想录算法营Day37 | 509. 斐波那契数,70. 爬楼梯,746. 使用最小花费爬楼梯
这题一样爬楼梯但是要求最小的花费,那么该题的状态转移公式就是dp(i) = min(cost(i-1)+dp(i-1),cost(i-2)+dp(i-2))。dp数组记录每层的最小花费。这题经典动态规划的开篇题,状态转移公式已经给出了就是F(i) = F(i-1) + F(i-2).与上题的状态转移公式一样.
2025-02-13 12:52:14
531
原创 代码随想录算法营Day36 | 56. 合并区间,738. 单调递增的数字,968. 监控二叉树
根据左右节点的情况来判断当前节点的情况,如果左右节点有一个是未覆盖状态,那么当前节点就该有摄像头并且增加摄像头数量,如果左右节点有一个有摄像头,那么当前节点就应该是覆盖状态,如果左右节点都是覆盖状态,那么当前节点就应当为未覆盖状态。最后判断一下根节点的状态是否为未覆盖状态,如果是则摄像头数量加1.这道题先将数字转成字符列表,然后从后向前遍历该列表,如果i-1的数字大于i的值,我们就对j-1上的数字减去1并且将i更新为新的flag,最后将flag及之后的数字都改成9以维护最大递增的性质。
2025-02-12 18:59:07
705
原创 代码随想录算法营Day35 | 435. 无重叠区间,763. 划分字母区间,452. 用最少数量的箭引爆气球
这题要求同一个字母最多出现在一个字母区间里,我们先记录一下每个单词在字符串中最后出现的位置。然后for遍历最大可以划分的区间保证这个区间内的字母不会出现在别的区间里。这题先给数组按每个interval的end进行升序排序,然后记录不重叠的interval的数量,最后用总长减去不重叠的interval数量即可。这题就是有尽量多的重叠区间。当两个区间不重叠时说明需要额外的一只箭。而当两个气球有重叠区域时,right应当取右区间最小的一个值。
2025-02-11 14:47:31
135
原创 代码随想录算法营Day34 | 134. 加油站,135. 分发糖果,860. 柠檬水找零,406. 根据身高重建队列
这道题我们设一个当前剩余油量以及总剩余油量为0,for遍历数组,每次累加当前剩余油量以及总剩余油量,如果当前剩余油量在某刻i累加后小于0时,说明start到i这段区间是肯定走不完的,故而更新start为i+1。最后判断总剩余油量是否小于0,如果小于0说明没有解返回-1,如果大于0则返回start。这题没啥说的很简单,主要是处理顾客支付20元的时候,如果手上有10元的就先花10元,没有的再花5元。每次判断5元的个数是否小于0.这道题先从前往后处理右比左大的情况,而后再从后往前处理左比右大的情况。
2025-02-10 14:28:28
419
原创 代码随想录算法营Day33 | 122. 买卖股票的最佳时机 II,55. 跳跃游戏,55. 跳跃游戏ll,1005. K 次取反后最大化的数组和
这道题先对数组按他们的绝对值进行降序排序,因为我们尽量将绝对值大的负数转为正数。在经历第一次for循环后,如果剩余的k为奇数说明还需要将列表中一个绝对值最小的一个正数转为负数,因为我们数组已经按他们的绝对值进行降序排序,那么当前数组最后一位的数字就是绝对值最小的一个正数,那么我们将其转为负数,返回当前数组的总和即可(如果剩余k是偶数我们无需其他操作,直接返回数组和即可)。我们想让股票的收益最大,那就是低处买高处卖,换言之这道题就是将所有股票的局部递增的情况的差值加起来,最后得出一个全局最优解。
2025-02-09 14:09:26
424
原创 代码随想录算法营Day32 | 455. 分发饼干,376. 摆动序列,53. 最大子数组和,51. N 皇后
这道题需要回溯加上一个验证算法。因为我们是按行从上到下放置皇后,那么我们在写验证算法的时候,只需要判断要放置的该列是否存在皇后,以及该格子的45度角与135度角是否有皇后存在。这题使用贪心,为了获得喂饱孩子的最大值,优先满足胃口小的孩子,所以需要对孩子的胃口值进行一个升序的排列。为了不浪费cookie也优先使用分量最小的cookie去满足孩子的胃口,所以对饼干的份量也按升序排列。这题每次取pre加上当前值之后的大小与pre相比之间的最大值,res每次保留pre与res中的最大值。
2025-02-08 11:55:24
399
原创 代码随想录算法营Day31 | 491.递增子序列,46.全排列,47.全排列 II
491.递增子序列491.递增子序列这道题与昨日的子集问题逻辑很类似,不过他对subset的要求是,,其中元素按。为了顾虑去重问题,我们需要准备一个集合uset去存放使用过的该层元素。
2025-02-07 18:41:33
498
原创 代码随想录算法营Day30 |93.复原IP地址,78.子集, 90.子集II
这道题与昨日的分割字符串有些相似,需要写一个is_valid函数来判断当前切割的数字是否合法。题目的限制是IP地址当为且他们的范围在之间且s代表整个的字符串,start和end代表要截取数字的范围。结合回溯加上验证算法,整体的代码实现如下在for循环里我们做了一个剪枝操作,即只遍历不超过start之后的三位,因为我们拼接出来的数字最多也就是三位数。
2025-02-06 14:00:26
412
原创 代码随想录算法营Day29 | 39. 组合总和, 40.组合总和II ,131.分割回文串
这题主要考在对startIndex的控制上,因为每个元素可以重复拿取,所以在startindex上我们不需要在下一次backtrack的时候进行加1操作,继续使用当前的startIndex即可。
2025-02-05 11:37:04
502
原创 代码随想录算法营Day28 | 77.组合,216.组合总和III,17.电话号码的字母组合
这题就是典型的回溯算法思路,具体实现如下。不过我们可以通过要求的subset长度做一些剪枝操作。正常来说在for循环的时候我们需要从startIndex遍历到n,但如果我们选择的startIndex到n的元素已经不足以填充subset去满足k个长度,那么我们就没有必要再对接下来的元素进行遍历。for循环中优化之后的代码如下。216.组合总和III这题思路与上题类似。
2025-02-04 14:11:47
240
原创 代码随想录算法营Day27 | 669. 修剪二叉搜索树, 108.将有序数组转换为二叉搜索树, 538.把二叉搜索树转换为累加树
这题很简单,用先序遍历即可,先判断当前root的值是否在范围内,如果当前root值大于该范围则返回左子树的修剪情况,如果小于该范围则返回右子树的修建情况。如果在范围之内,则递归返回左右子树的修剪情况,最后返回该节点。
2025-02-03 13:10:07
315
原创 代码随想录算法营Day20 | 235. 二叉搜索树的最近公共祖先, 701.二叉搜索树中的插入操作,450.删除二叉搜索树中的节点
235. 二叉搜索树的最近公共祖先前天做了一个二叉树的最近公共祖先的题,现在是二叉搜索树的最近公共祖先的题。通过二叉搜索树的特性我们可以更快的得出结果。701.二叉搜索树中的插入操作这道题递归插入,如果当前root为None就返回TreeNode(val)。如果val大于当前root.val那么root.right = 右侧函数插入结果。如果val小于当前root.val那么root.left = 函数左侧插入结果。
2025-01-27 16:06:55
363
原创 代码随想录算法营Day18 | 530.二叉搜索树的最小绝对差,501.二叉搜索树中的众数,236. 二叉树的最近公共祖先
这道题使用二叉搜素树的性质即中序遍历的时候是有序的,那么众数一般是聚集在一棵子树上的,我们可以用双指针一个pre节点的值和一个当前节点的值做比较来统计出现的频率以及当前出现频率的最大值。当我们发现左右紫树都找到了我们的target节点,那么当前的中节点即为p,q两节点的公共节点。若其中有一个子树的搜寻结果反回来的是None,那当前左子树返回的搜寻结果即为p,q两节点的公共节点,这题用递归法中序遍历的方式比较当前值与pre节点值的差值,不断更新最小的差值即可。这道题需要自底向上回溯的逻辑而后序遍历。
2025-01-25 16:27:52
373
原创 代码随想录算法营Day17 | 654.最大二叉树,617.合并二叉树,700.二叉搜索树中的搜索,98.验证二叉搜索树
654.最大二叉树654.最大二叉树这题与昨日根据中序遍历与后序遍历得出来的数组来构建二叉树思路类似,不过就是每次需要找出子数组中最大的作为根节点。617.合并二叉树这题深度优先递归合并二叉树。很简单具体如下。700.二叉搜索树中的搜索这题经典,在二叉搜索树当中,中节点的值大于左节点小于右节点。98.验证二叉搜索树这题很多人一眼会觉得很简单不就是递归判断每个左右中节点的关系是否符合二叉搜索树的规则。但其实这里有个陷阱。举个例子,像。
2025-01-24 17:52:54
759
原创 代码随想录算法营Day16 | 513. 找树左下角的值,112. 路径总和, 113. 路径总和ll,106.从中序与后序遍历序列构造二叉树
的顺序那么数组最后一个数字就是二叉树的根节点的数值,同时,中序遍历所得出的数组是遵循左中右的顺序,那么我们需要一个map去记录节点数值与数组index的映射关系方便我们在通过后序遍历数组找到root节点数值时,通过该map获得该root节点在中序遍历数组中所在的index那么该index的左右两边的数值情况就是该root节点左右子树的情况。这道题通过广度优先的层序遍历,依次从右往左遍历并更新结果值,当最后一个node被遍历后,那么结果值就是树左下角的值。这道题首先要搞清什么是中序遍历,什么是后序遍历。
2025-01-23 20:48:04
396
原创 代码随想录算法营Day15 |110.平衡二叉树,257. 二叉树的所有路径,404.左叶子之和, 222.完全二叉树的节点个数
这题用递归的方式计算高度的同时判断左右子树是否平衡(平衡二叉树的定义就是所有的左右子树之间的高度差不能大于1)如果高度差大于1我们就直接返回-1。我们在求解高度的同时,判断左右子树的高度差的一个好处就是一旦有一个子树的高度差没达到标准,那么后面的其他的子树都不用算了,而如果满足标准,那么我们就返回实际高度进行下一步的计算。左叶子表示二叉树中位于左边且其无左右节点的节点。用递归法先遍历左边的节点,判断当前节点的左节点是否为左叶子节点如果是则赋值给count,若不是则继续遍历左子树最后将值赋值给count。
2025-01-22 11:15:29
632
原创 代码随想录Day14 | 226.翻转二叉树,101. 对称二叉树
这个通过递归的思路,每次翻转左右两个节点,最后将新的左右节点接上去,返回输入节点即可。另外两道题关于树的最大深度与最小深度已经在Day13做过了,故不再详做叙述。这题递归判断两侧节点是否相同。101. 对称二叉树。
2025-01-21 10:29:12
198
原创 代码随想录算法营 Day13|二叉树的层序遍历
这题依旧层序遍历,不过每次放入队列中的节点是先放右节点再放左节点。这样可以保证每层的开始节点就是最右边的节点,遍历每层记录该层最开始的节点即可。这题层序遍历思路,每次层序遍历时取出队首的node,然后将其next指向新的队首。这道题用广度优先就行了,不过每次循环得记一下当前q中元素的个数及该层节点的个数。这题思路与之前的一样,不过这次需要计算每层的平均值。这题深度优先秒了,递归返回左侧树与右侧树的最大深度。这题层序遍历的要求换成了找最大值,思路依旧一样。这题不过是二叉树换成了N叉树,思路还是一样的。
2025-01-20 20:17:18
230
原创 代码随想录算法营Day11 | 150. 逆波兰表达式求值
这道题用单调队列来做,保证队列中的元素是单调递减的即可。在遍历数组的时候,当窗口开始滑动时,判断旧窗口开始处的元素是否等于队首的元素,如果相等则出队,否则就无事发生。在新元素入队时判断新元素是否大于队尾元素,如果大于则删除队尾元素直到新元素小于队尾元素(保证队列的单调递增)。这道题用小顶堆来做,先统计每个数字出现的频率,这里我就直接用python的Counter来统计了。如果小顶堆的长度大于k,那么我们就pop顶部元素。当遇到运算操作符的时候就pop出栈顶的两个元素,再将处理后得出的结果再推入栈中。
2025-01-18 23:00:24
132
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人