- 博客(31)
- 收藏
- 关注
原创 代码随想录三十七天 完全背包二维 完全背包一维 518. 零钱兑换 II 377. 组合总和 Ⅳ
2. 其次,这里的遍历顺序要是正的。如图所示,要使用的上一行的元素在自己的右边,倒着遍历就覆盖了。写方法数的时候有的时候会忘记初始化dp[0]=1,用一维数组写的时候,想一下第一排的内容。这题代码用代码随想录上的一维遍历的方式太不好理解了,用爬楼梯 比较好理解,也不难写。1. 首先和 01背包的dp方程不一样了。完全背包的简单应用,是组合数。518. 零钱兑换 II。初始化和dp方程变化了。377. 组合总和 Ⅳ。
2025-05-13 11:14:53
302
原创 代码随想录算法训练营第三十六天| 1049. 最后一块石头的重量 II 494. 目标和 474.一和零
1. 对dp的定义有点没有弄明白。例如此题中sum=23,target=11。我本来再想dp[11]不等于11,有没有可能dp[16]可能是11。这里的dp是最后一行的dp,已经迭代到最后,迭代到所以的物品。所以dp[11]的含义是所有的物品的组合等于11 的可能。是当背包容量为11时,所有物品组合的重量的 最大值。2. 石头分成了两堆。小的那堆是dp[target],大的那堆是sum-dp[target]1049. 最后一块石头的重量 II。基本上和上一题一样,有两点不一样。
2025-05-12 11:11:52
209
原创 代码随想录算法训练营第四十四天| 1143.最长公共子序列 1035.不相交的线 53. 最大子序和 392.判断子序列
2. 这题的dp的方法的思路清楚明了一点。但是有点搞不明白:为什么下标i要选上。2. 在这道题中,加上了边界,多加了一行。有很多容易遗漏的易出错的地方。1. 和上一道题,那个718 最长重复子数组很像。就是转移方程不一样。1. 在油管上抄了个精简的kaneda算法。偷了个懒,把最大公共子序列的代码粘贴过来了。很神奇,这题和上题代码一毛一样。再看一下官方的答案,精简一下。1143.最长公共子序列。1035.不相交的线。
2024-11-16 17:39:02
148
原创 代码随想录算法训练营第四十三天| 300.最长递增子序列 674. 最长连续递增序列 718. 最长重复子数组
3. 本题而言,最大值的比较,我的第一印象还以为要比较所有的dp,像今天的第一题那样,可以学一下这个方法。用一个max值来记录,只需要在赋值的时候比较一次就可以了。dp[i]表示i以前的子序列,不一定是从0开始的。在dp[i]开始赋值的时候,从0开始的位置开始比较,一直比较到i-1。2. 本题而言,容易错的地方,if判断一开始写错了,要小心越界。1. 语法方面,又忘记了cpp 的二维数组的定义方法。1. 动态规划的方法没看,直接用的贪心算法。718. 最长重复子数组。300.最长递增子序列。
2024-11-16 11:20:51
231
原创 代码随想录算法训练营第三十五天| 01背包问题 二维 01背包问题 一维 416. 分割等和子集
j++) 这里不是从j=1开始,从第一个物品的重量开始。赋初值的时候从第一个物品的重量开始。替换当前的,不是j-1。在对应位置不会被覆盖,防止重复计算。有点懵,感觉有点反直觉。和背包问题之间的联系我都要想一会儿。dp[11]代表背包容量是11的时候,能放几个数字。这行其实可以直接省略,因为如果当前物品不能放入背包,那么。2. 关于dp[i][j]的含义,容易搞错,慢慢想。: 在倒序遍历时,应该是从。
2024-11-01 16:18:10
317
原创 代码随想录算法训练营第三十四天| 62.不同路径 63. 不同路径 II
一开始对上边界和左边界的推断写错了,上边界和左边界只有1条路可以达到。写的时候不知道思路。但是看了答案之后思路还是很清晰的。63. 不同路径 II。
2024-10-30 10:37:26
116
原创 代码随想录算法训练营第三十三天| 122.买卖股票的最佳时机II 55. 跳跃游戏 70. 爬楼梯 746. 使用最小花费爬楼梯
一开始还有点没想明白,看视频想明白了。从最后一步开始往回看。因为一次只能上1级或者是2级楼梯。从i-2再上两层,或者是从i-1再上1层。2. 可以将i=2和i=n代入进去看一下,搞不清楚怎么写的时候。1.这里的临界点有点搞不清楚,代入进去看一下。746. 使用最小花费爬楼梯。
2024-10-29 17:19:30
133
原创 代码随想录算法训练营第二十八天| 122.买卖股票的最佳时机II 55. 跳跃游戏 45.跳跃游戏II 1005.K次取反后最大化的数组和
2. 题解给出的思路是,if(price<min_price)这个可以理解为,如果是下降,就更新最小值,如果不是。3. if else if 这个的流程图都有点忘了,是if的条件不满足的话,再继续判断else if 的条件,两者的语句块只会执行一个。2. for(int num:nums)是值传递,不会修改数组的值,想要修改数组的值,要引用传递。1. 我一开始思考的是,怎么当出现第一次上升开始,然后累计增加,不知道代码怎么写。这题有陷阱,不能遍历数组所有的点,因为去不了。还有点特殊,循环条件也是一个变量。
2024-10-22 10:51:06
234
原创 代码随想录算法训练营第二十七天| 455.分发饼干 376. 摆动序列 53. 最大子序和
最大的饼干满足最大胃口的孩子,比较最大胃口g[i]和最大饼干s[index],如果最大胃口不满足,再依次减小胃口,与最大饼干比较。满足之后,再减小 饼干尺寸。cur_max的定义比较难思考,要么是当前值,要么是当前值加上之前的最大值(因为是连续的),好好品味吧。先把逻辑想明白再写。想明白了能写明白那个for 和if。使用了kanade算法。没写,考虑的情况好复杂。
2024-10-16 11:18:20
168
原创 代码随想录算法训练营第二十四天| 93.复原IP地址 78.子集 90.子集II
2. 字符串的差值s[i]-'0',这个可以从字符串得到 int类型的数。4. startindex是什么,是每次字符串操作的起始点。1. for循环里面i+1 和i+2 ,位置要好好考虑。3. 从字符串数字得到数字的 num操作。
2024-10-16 11:12:48
206
原创 代码随想录算法训练营第二十三天| 39. 组合总和 40.组合总和II 131.分割回文串
2. 这题有两个关键,一个是剪枝。剪枝要注意细节,在for循环里面continue之前要弹出。第二个关键是,可以使用相同的元素,第一次选2,3,6,7、对应的2选2,3,6,7、 对应的3选3,6,7。如果对应的3选2,3,6,7 ,就涉及到复杂的去重问题。1. 思路非常简单,会占用一点内存。1. 要学习思路,怎么用回溯来做分割。自己的版本,跑不出来,有缘再写吧。2. 三个边界值要想半天,好好捋捋。
2024-08-31 22:16:09
321
1
原创 代码随想录算法训练营第二十二天| 77. 组合 216.组合总和III 538.把二叉搜索树转换为累加树 17.电话号码的字母组合
for是横向循环,确定1,2,3,4。递归是纵向的,在选到1之后,选出2,3,4。3. 剪枝操作比较复杂,核心是在选定了1之后减少操作,在for循环里面做。1. 和上一题差不多,改变一下递归的条件就可以了。1. 看讲解后写轮眼复刻。17.电话号码的字母组合。216.组合总和III。
2024-08-30 11:51:42
487
原创 代码随想录算法训练营第二十一天| 669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树
1. 本来以为要分奇偶,后来发现不用,使用递归,每次都分成两半就可以了。需要考虑 nums.size()==0,因为如果数组长度是2的话,分开之后有 一半 的长度是0.2. 在分数组的时候,卡了一下。因为5/2==2 ,不是等于3. 这个是取整符,基本上没有能得到3 的操作。这里public里面的pre=0,是为了清空之前的pre值。1. 智障法 先变成数组,再通过数组里面查找index,重新遍历修改二叉树。对二叉搜索树中序遍历相当于 数组的正序遍历, 因此反中序遍历就相当于数组的 反着遍历。
2024-08-29 10:46:01
998
原创 代码随想录算法训练营第二十天| 235. 二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点
2. 注意左右子树都是一大串,不止一个单结点。左子树串在 右子树的最左边。(左子树串都比root小,root比右子树串小,右子树的左下角最小)1. 有返回值和无返回值的递归很不一样。这题的关键是有返回值,所以递归的时候让左子树等于 函数的返回值。3. 第一次使用auto,自动匹配类型,有点像golang里面的:=不想动脑子,沿用了 普通二叉树的 最近公共祖先,和昨天那题一样。1.需要考虑的情况很多,这种复杂的情况试着自己想一下,想完整。235. 二叉搜索树的最近公共祖先。450.删除二叉搜索树中的节点。
2024-08-27 10:56:11
318
原创 代码随想录算法训练营第十九天| 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236. 二叉树的最近公共祖先
1. 这题的关键在于二叉搜索树的中序遍历就是 有序序列。530.二叉搜索树的最小绝对差。236. 二叉树的最近公共祖先。501.二叉搜索树中的众数。1. 使用map来统计频率。
2024-08-26 11:32:32
465
原创 代码随想录算法训练营第十七天| 654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树
最大值下标:int maxPosition = max_element(v.begin(),v.end()) - v.begin();最大值:int maxValue = *max_element(v.begin(),v.end());2. vector容器取切片的方法。1. 偷懒直接用了内置的函数。700.二叉搜索树中的搜索。98.验证二叉搜索树。
2024-08-10 12:38:24
237
原创 代码随想录算法训练营第十六天| 110.平衡二叉树 257. 二叉树的所有路径 404.左叶子之和 106.从中序与后序遍历序列构造二叉树
106. 从中序与后序遍历序列构造二叉树注意:1. vector的构造函数使用迭代器的时候是左闭右开,最常见的( s.begin(),s.end())就不包括end(),end()迭代器是空的2. 使用到的另一个vector的函数是 resize()。不能直接vector.size()= n 去改变size大小。
2024-08-07 09:42:14
292
原创 代码随想录算法训练营第十五天| 110.平衡二叉树 257. 二叉树的所有路径 404.左叶子之和 222.完全二叉树的节点个数
2. 用层序遍历的时候,直接用队列,写的比之前熟练了一些。注意把左右孩子入队的时候,要考虑是不是null。7/1 补 6/20. 最近态度不太对,只想快点完成任务,没有认真弄明白每一题。1. 用递归法比较简单。把根结点加上的时候就是在计数。1. 比较好写,用到之前写的 二叉树的最大深度。明天写,看一下回溯怎么完成的。逻辑好复杂,看了题解才写出来。222.完全二叉树的节点个数。257. 二叉树的所有路径。
2024-07-01 23:31:16
292
原创 代码随想录算法训练营第十四天| 226.翻转二叉树 101. 对称二叉树 104.二叉树的最大深度 111.二叉树的最小深度
和上一题有一些出入,需要考虑当某一边 为null的时候、正确写法:里面有一段比较两个二叉树是否相等的代码。104.二叉树的最大深度。111.二叉树的最小深度。6/30 补 6/19。遍历然后交换左右孩子。101. 对称二叉树。
2024-06-30 15:28:55
248
原创 代码随想录算法训练营第十三天|二叉树 递归遍历 迭代遍历 层序遍历
1. 前序遍历和后序遍历的处理基本相似。前序遍历是中左右,后序遍历是左右中。后序遍历的时候调成 中右左,然后将结果反转就可以了。1. 递归遍历如果会写的话,比较省事。比较重要的是别忘了递归的终止条件。有点数学题中是n=0或者1,有的情况是 指针为空。一直找左子树的左子树,找到最左。处理完了之后,再处理中和右。当处理到最右边,cur已经空了,但是此时栈里还有值,即使while的循环条件。1. 直接输出比较好些,一行一行的按照容器输入,设计了size的方法。2. 二维数组里面的每个元素是一个一维数组。
2024-06-20 16:33:41
235
原创 代码随想录算法训练营第十天|栈与队列 150. 逆波兰表达式求值
1. C++中 没有 int( "3"+"+"+"4"),不合法,C++中没有字符串相加再计算的操作,忘记是哪个语言的特性了。2. stoll 将字符串转换成 long long 型。150. 逆波兰表达式求值。
2024-06-17 23:20:40
221
原创 代码随想录算法训练营第九天|栈与队列 232.用栈实现队列 225. 用队列实现栈 20. 有效的括号 1047. 删除字符串中的所有相邻重复项
232.用栈实现队列。
2024-06-16 21:03:22
557
原创 代码随想录算法训练营第八天|字符串 151.翻转字符串里的单词 卡码网:55.右旋转字符串
1. 和151的思路一样,先 整体反转,再部分反转。复杂的字符串反转可以考虑这个思路。1. 复习了 移除元素中的双指针法, 本题的双指针解法改天再看,猪脑过载。2. s.erase()的使用不熟悉。
2024-06-14 22:00:49
490
原创 代码随想录算法训练营第六天|哈希表 454.四数相加II 383. 赎金信 【15*】. 三数之和 【18*】. 四数之和
454.四数相加IImap的初始化疑惑。
2024-06-12 11:19:43
349
原创 代码随想录算法训练营第五天|哈希表 242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和
今天光速学习了 数组,set,map的相关操作,然后才做题。数组的操作都要忘干净了。常用操作如下: 查找用的很多,查找的返回是迭代器。删除没怎么用。
2024-06-11 17:00:36
199
1
原创 代码随想录算法训练营第四天|链表 24. 两两交换 19.删除倒数第n个 160.链表相交 142.环形链表
1. ->next (=null)访问到空指针没问题,但是 ->next->next(null->next) 访问空指针的next就不行了,会出现 member access within null pointer的问题。此题小心while循环里面, 判断条件,小心引用空指针,找好边界。1. 明天继续看一下 为什么n=1 ,n至少为1圈。复杂一点的双指针方法,学习思路。傻子选择直接两次遍历。
2024-06-08 22:28:08
173
原创 代码随想录算法训练营第三天|链表 203. 移除元素 707.设计链表 206.反转链表
1. 用while循环的时候,可以用边界点来确定循环条件,例如 在某点插入元素 ,把n=0 带进while循环试一下。4. 不要用private 的m_size遍历做循环条件,我劝你别乱用。2. 有index的,要检查一下 范围是否合规。3. 写的链表结构体,就是使用 虚拟头结点的。1. 没用pre,明天再写一遍。1. C++别忘了内存释放。2. 注意访问空指针的问题。
2024-06-07 23:04:08
286
原创 代码随想录算法训练营第二天|数组 977. 有序数组平方 209.长度最小子数组 59.螺旋矩阵
for循环的循环条件和初始值是有关系的,写的时候要么确定循环次数要么确定终止值。)这种循环写法循环了n次,但是注意初始值变化后,就不是n次了。容易惯性,刻舟求剑。使用滑动窗口的时候,确定好窗口的起始和终止。滑动窗口的起始位置可以减少重复计算前面的值。滑动窗口的灵魂在于起始位置和终止位置都很灵活。
2024-06-06 15:07:00
227
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人