代码随想录算法训练营
文章平均质量分 60
记录了大一下的训练营历程
dkingf
一枚计算机大学生,渴望提升自己
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
代码随想录训练营第36天 ||1049. 最后一块石头的重量 II 494. 目标和 474. 一和零
01背包问题:题意说要求粉碎石头后留下的最小石头重量,石头粉碎的规则是两个石头如果重量相等,同时粉碎,如果重量不相等,粉碎后的重量是大减小。抽象成背包问题,就是尽可能装满总石头重量一半的背包,此时粉碎的最彻底,为什么粉碎的更彻底,因为尽可能装满石头重量一半的背包,这样能装进背包的这部分,就会对应另一半的部分同时粉碎,此时剩下的就是无法粉碎的石头。1.在理解背包是二维的容量,并且01背包的常规滚动数组的方法,但是因为背包容量是二维的,所以还是使用二维数组,想要使用常规01背包二维数组的方法,要使用三维数组。原创 2025-04-20 23:47:34 · 1048 阅读 · 0 评论 -
代码随想录训练营第29天 || 134. 加油站 135. 分发糖果 860. 柠檬水找零 406. 根据身高重建队列
讲解:代码随想录。原创 2025-04-12 22:55:54 · 343 阅读 · 0 评论 -
代码随想录训练营第39天 || 198. 打家劫舍 213. 打家劫舍 II 337. 打家劫舍 III
所以每个房屋都有盗取和不盗取两个选择,盗不盗取取决于金额,所以递推公式为dp[ i ] = max(dp[ i-1] (不盗取),dp[i-2 ]+nums[ i ](盗取))dp[ i ] = max(dp[ i-1] (不盗取),dp[i-2 ]+nums[ i ](盗取))3.dp数组的初始化:因为递推公式要取最大盗取金额,同时金额都为非负数,所以初始化为最小值0。3.dp数组的初始化:因为递推公式要取最大盗取金额,同时金额都为非负数,所以初始化为最小值0。//{ }是列表的初始化来赋值数组。原创 2025-04-23 22:03:08 · 387 阅读 · 0 评论 -
代码随想录训练营第35天 || 01背包问题 416. 分割等和子集
就是将一些有价值的物品(只能放一次),放入有限容量的背包里,怎么放价值最大。二维数组方法。原创 2025-04-19 10:50:59 · 690 阅读 · 0 评论 -
代码随想录训练营第20天 ||1.二叉搜索树的最近公共祖先 2.二叉搜索树中的插入操作 3.删除二叉搜索树中的节点
递归法:也是跟上题一样利用二叉搜索树的性质查找,但查找到之后,需要分情况讨论,第一种没找到,第二种找到,是叶子结点,第三种四种就是一个有左子节点,一个右子节点,第五种比较麻烦,有左右子树,要把左子树,放到右子树的最左边的子节点。递归法:最简单的插入,就是在二叉搜索树的空结点直接插入,但想要找到这个恰好的位置,就需要利用二叉搜索树的性质,当遍历到的结点大于插入值时就向左子树遍历,反之向右子树遍历,当遇到空结点时,恰好就是插入元素该待的位置。1.对于遍历到的结点不在p与q的范围内的情况。原创 2025-04-01 21:19:47 · 196 阅读 · 0 评论 -
代码随想录训练营第30天 || 452. 用最少数量的箭引爆气球 435. 无重叠区间 763. 划分字母区间
非常像,弓箭的数量就相当于是非交叉区间的数量,只要把弓箭那道题目代码里射爆气球的判断条件加个等号(认为[0,1][1,2]不是相邻区间),然后用总区间数减去弓箭数量 就是要移除的区间数量了。通过左边界或右边界排序,以右边界为例,排序后,判断右边界是否与右边区间的左边界重叠,如果重叠,重新切割右面的区间,直到不重叠为止,这样就保证重叠的区间最多,同时消耗的箭最少。对于气球数量的错误理解:正确的是,每一个区间里有气球,只要射到区间内,区间内的气球就会全中。局部最优:当气球出现重叠,一起射,所用弓箭最少。原创 2025-04-13 19:54:07 · 1342 阅读 · 0 评论 -
代码随想录训练营第23天 || 1.组合总和 2.组合总和 II 3.分割回文串
所以每当遍历到符合目标值的组合后,就不能再重复使用candidates(给出的候选人集合,候选人集合)中与前一个值相同的值作为下一个候选人集合的开头,想象成树,就是当遍历同一层时,就不能使用相同的元素,否则会出现重复的集合。1.对于used数组的作用:用来判断当前遍历到的候选人是否为某一个path结果的开头节点,通过检测上一个节点的bool值来判断,当为false时,则是某一个path结果的开头节点,就直接跳过,不能使用重复的值,否则会有重复的结果集。原创 2025-04-07 19:38:36 · 297 阅读 · 0 评论 -
代码随想录训练营38天 || 322. 零钱兑换 279. 完全平方数 139. 单词拆分
但是先遍历背包,再遍历物品不同,此时由于先遍历背包,所以只能在遍历完物品后,在判断语句 if (i - coins[j] >= 0 && dp[i - coins[j]]!先遍历物品,再遍历背包,先遍历背包,再遍历物品都可以,不同的地方是,在先遍历物品,再遍历背包时,因为先遍历物品,所以j可以直接在coins[ i ]等于物品时开始,dp[ 0 ]是背包容量为0的时候,硬币数量为0,因为递归公式是求最小的数值,所以初始化其他的数要是最大值,才不会影响结果。j为背包容量,i为物品的下标。原创 2025-04-22 22:50:28 · 491 阅读 · 0 评论 -
代码随想录训练营第22天 || 1.组合 2.组合总和 III 3.电话号码的字母组合
讲解:代码随想录。原创 2025-04-07 00:07:41 · 143 阅读 · 0 评论 -
代码随想录训练营第25天 || 491. 非递减子序列 46. 全排列 47. 全排列 II
递归:抽象为一颗树,不能使用标记数组进行去重,因为不能排序,所以使用一个集合来去重,如果使用过就放入集合,每当取数时,如果在集合中找到,就跳过当前数,来去重,注意集合是每遍历层就会重置,这一步很巧妙,避免同层重复。2..只要是树层去重,使用标记数组,就要进行排序:原因是如果不排序,重复的元素不会相邻,这样就没法通过查找标记数组来确定,是树层的遍历,还是树枝的遍历。递归:相比于上一题,因为原数组有了重复的数,但是结果又不能有重复的,所以不光需要树枝去重,还需要树层去重。1.对于树枝去重和树层去重的理解。原创 2025-04-09 19:33:44 · 559 阅读 · 0 评论 -
代码随想录训练营 || 509. 斐波那契数 70. 爬楼梯 使用最小花费爬楼梯
从递归公式dp[i] = dp[i - 1] + dp[i - 2];中可以看出,dp[i]是依赖 dp[i - 1] 和 dp[i - 2],那么遍历的顺序一定是从前到后遍历的。2.确定递推公式:dp[ i ] = dp[i-1] + dp[i-2] 原因是当前阶层只能由下一层迈一步,或下两层迈两步到达。2.确定递推公式:dp[i] = min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);dp[i]的定义为:第i个数的斐波那契数值是dp[i]1.对于递推公式的如何推导的。原创 2025-04-15 21:25:37 · 416 阅读 · 0 评论 -
代码随想录训练营第24天 || 93. 复原 IP 地址 78. 子集
1.对于used列表的理解:当进行向叶子节点的遍历时,不需要去重,当遍历完叶子节点,回到上一层的树时,需要进行去重,因为此时从左到右遍历会出现与之前相同的结果子集。1.对于break的理解:因为当前区间已经大于255,或者为01时再加数的话,也是不满足的所以直接结束遍历。递归:是组合|| 和子集两个题的结合体,需要在遍历同一层时,进行去重,需要一个used列表进行层遍历的判断。1.对于向result添加的方式:在递归函数的开头,中止条件的前添加结果,可以在一开始添加进去空集。原创 2025-04-08 17:17:31 · 168 阅读 · 0 评论 -
代码随想录训练营28天 || 122. 买卖股票的最佳时机 II 55. 跳跃游戏 45. 跳跃游戏 II 1005. K 次取反后最大化的数组和
不用管具体跳到哪一格,而是边遍历格子,边计算最大跳到的范围,如果遇到跳不到的情况就中止。原创 2025-04-11 22:22:55 · 334 阅读 · 0 评论 -
代码随想录训练营37天 ||518. 零钱兑换 II 377. 组合总和 Ⅳ 57. 爬楼梯
思路和01背包差不多,不同的是在遍历顺序的选择上有所不同。组合问题:先遍历物品,再遍历背包。排列问题:先遍历背包,再遍历物品。这种分配不是绝对的,但在一般情况下是最简单的,逻辑简单的。此题是一个排列问题,所以在遍历顺序时,选择先遍历背包,再遍历物品。此题是一个组合问题,所以选择先遍历物品,再遍历背包。排列问题,遍历顺序选择先遍历背包,再遍历物品。1.对于遍历顺序的不同、原创 2025-04-21 19:46:05 · 191 阅读 · 0 评论 -
代码随想录训练营第27天 || 455. 分发饼干 376. 摆动序列 53. 最大子数组和
1.对于第二个将count重置为0时,会影响result:但是观察发现在判断result和count的关系前,count就已经加上了数组内的数,所以不用担心数组内全是负数的情况。局部最优,把最大的饼干给胃口最大的孩子,因为目的是满足最多的孩子,最大的饼干可以满足胃口大的孩子,也可以满足胃口小的孩子,但是小的饼干只能满足胃口小的孩子。1.对于特殊情况的理解,对于只有两个元素的情况,为了符合大于两个元素的判断情况,让result默认为1,1.对于先遍历谁的问题,只能是饼干去匹配小孩的胃口,原创 2025-04-10 23:07:18 · 515 阅读 · 0 评论 -
代码随想录训练营第34天 || 62. 不同路径 63. 不同路径 II
2.确定递推公式:因为中间的位置最多只能由左边移动1,上面移动一到达,所以公式是dp[i][j] = dp[i - 1][j] + dp[i][j - 1]3.dp数组的初始化:注意特殊情况,靠上的一行和靠左的一列都是只能一直向右移动,或一直向下移动,所以只有一条路径,所以把这些位置初始化为1。2.确定递推公式:dp[i][j] = dp[i - 1][j] + dp[i][j - 1]1.确定dp数组下标及其含义:dp数组是用来代表到达每一个位置的所有路径数,下标是对应的位置。原创 2025-04-16 09:36:22 · 455 阅读 · 0 评论 -
代码随想录训练营第21天 ||1.修剪二叉搜索树 2.将有序数组转换为二叉搜索树 3.把二叉搜索树转换为累加树
递归法:分割法:找出有序数组的中间值,因为二叉搜索树的性质,根节点是一个不大不小的中间值,所以把有序数组不断分割,在分割后的区间内,继续从中间分割,每次用来分割的值作为二叉搜索树的中间节点,也就是父节点。递归法:利用二叉搜索树性质,大于范围向左子树搜,小于范围,向右子树搜,并且将搜索的下一个符合范围的节点传给上一个符合范围的节点的子节点,从而删除节点。1.对于如何删除节点的疑惑,直接用上一个节点的子节点接住不符合范围的节点的下一个子节点。原创 2025-04-02 19:37:26 · 191 阅读 · 0 评论 -
代码随想录训练营第31天 || 56. 合并区间 738. 单调递增的数字
i++)//flag的作用很巧妙,如果上一个循环没有进入if,也就是最大单调递增数字就是自己本身,可以直接跳过此循环。与之前射气球的题很像,也是先用左右边界的一个边界排序,再判断是否重叠。左边界排序,使用正序进行遍历,右边界排序逆序进行遍历,原因是左边界排序,最左边的左边界一定是最小的,但右边界不一定,同理右边界。一个循环判断当前数字是否为递增数字,如果是直接返回,如果不是,就记录非递增数字的最高位,把最高位减一,然后把最高位的低位都改为9,此时就为最大递增数字。原创 2025-04-14 19:40:11 · 283 阅读 · 0 评论 -
代码随想录训练营第十七天 || 1.从中序与后序遍历序列构造二叉树 2. 最大二叉树 3.合并二叉树 4. 二叉搜索树中的搜索 5. 验证二叉搜索树
递归索引:想要构造一个最大二叉树,就是不断找到数组中的最大值,分割数组,再在分割后的数组中找最大值,继续分割,每次分割出的最大值就是二叉树及其子树的根节点。递归法:通过中序遍历,可以正好利用二叉搜索树的性质,因为是从二叉搜索树的最左下角,所以是最小的结点,不断遍历结点的值应该不断增大,所以判断是否遍历的过程是否递增即可。1.对于二叉搜索树的概念理解错误:二叉搜索树是父节点永远大于左子树,永远小于右子树。1.对于二叉搜索树的概念理解错误:二叉搜索树是父节点永远大于左子树,永远小于右子树。原创 2025-03-30 21:07:09 · 1143 阅读 · 0 评论 -
代码随想录训练营第十八天 ||1. 二叉搜索树的最小绝对差 2.二叉搜索树中的众数 3. 二叉树的最近公共祖先
递归法:通过中序遍历利用二叉搜索树的性质,统计元素的次数,将前一个结点与当前结点的值比较,如果相等那么次数加一,直到出现不同时判断次数是否大于之前已经查找过的众数的次数,如果是那把结果集清空,加入当前众数,如果相等,那直接加入结果集,如果小于,那么直接略过。1.递归法:因为是查找两个结点的最近公共祖先,也就是最近父节点,所以首先要先能找到两个结点的位置,之后再判断最近公共祖先是谁,所以采用后序遍历,先遍历左右子节点,再处理中间结点。递归法:通过中序遍历,可以利用二叉搜索树的性质。1.对于遍历种类的选择。原创 2025-03-31 19:49:33 · 274 阅读 · 0 评论
分享