- 博客(34)
- 收藏
- 关注
原创 代码随想录训练营第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
314
原创 代码随想录训练营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
463
原创 代码随想录训练营37天 ||518. 零钱兑换 II 377. 组合总和 Ⅳ 57. 爬楼梯
思路和01背包差不多,不同的是在遍历顺序的选择上有所不同。组合问题:先遍历物品,再遍历背包。排列问题:先遍历背包,再遍历物品。这种分配不是绝对的,但在一般情况下是最简单的,逻辑简单的。此题是一个排列问题,所以在遍历顺序时,选择先遍历背包,再遍历物品。此题是一个组合问题,所以选择先遍历物品,再遍历背包。排列问题,遍历顺序选择先遍历背包,再遍历物品。1.对于遍历顺序的不同、
2025-04-21 19:46:05
176
原创 代码随想录训练营第36天 ||1049. 最后一块石头的重量 II 494. 目标和 474. 一和零
01背包问题:题意说要求粉碎石头后留下的最小石头重量,石头粉碎的规则是两个石头如果重量相等,同时粉碎,如果重量不相等,粉碎后的重量是大减小。抽象成背包问题,就是尽可能装满总石头重量一半的背包,此时粉碎的最彻底,为什么粉碎的更彻底,因为尽可能装满石头重量一半的背包,这样能装进背包的这部分,就会对应另一半的部分同时粉碎,此时剩下的就是无法粉碎的石头。1.在理解背包是二维的容量,并且01背包的常规滚动数组的方法,但是因为背包容量是二维的,所以还是使用二维数组,想要使用常规01背包二维数组的方法,要使用三维数组。
2025-04-20 23:47:34
978
原创 代码随想录训练营第35天 || 01背包问题 416. 分割等和子集
就是将一些有价值的物品(只能放一次),放入有限容量的背包里,怎么放价值最大。二维数组方法。
2025-04-19 10:50:59
666
原创 代码随想录训练营第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
427
原创 代码随想录训练营 || 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
394
原创 代码随想录训练营第31天 || 56. 合并区间 738. 单调递增的数字
i++)//flag的作用很巧妙,如果上一个循环没有进入if,也就是最大单调递增数字就是自己本身,可以直接跳过此循环。与之前射气球的题很像,也是先用左右边界的一个边界排序,再判断是否重叠。左边界排序,使用正序进行遍历,右边界排序逆序进行遍历,原因是左边界排序,最左边的左边界一定是最小的,但右边界不一定,同理右边界。一个循环判断当前数字是否为递增数字,如果是直接返回,如果不是,就记录非递增数字的最高位,把最高位减一,然后把最高位的低位都改为9,此时就为最大递增数字。
2025-04-14 19:40:11
261
原创 代码随想录训练营第30天 || 452. 用最少数量的箭引爆气球 435. 无重叠区间 763. 划分字母区间
非常像,弓箭的数量就相当于是非交叉区间的数量,只要把弓箭那道题目代码里射爆气球的判断条件加个等号(认为[0,1][1,2]不是相邻区间),然后用总区间数减去弓箭数量 就是要移除的区间数量了。通过左边界或右边界排序,以右边界为例,排序后,判断右边界是否与右边区间的左边界重叠,如果重叠,重新切割右面的区间,直到不重叠为止,这样就保证重叠的区间最多,同时消耗的箭最少。对于气球数量的错误理解:正确的是,每一个区间里有气球,只要射到区间内,区间内的气球就会全中。局部最优:当气球出现重叠,一起射,所用弓箭最少。
2025-04-13 19:54:07
1271
原创 代码随想录训练营28天 || 122. 买卖股票的最佳时机 II 55. 跳跃游戏 45. 跳跃游戏 II 1005. K 次取反后最大化的数组和
不用管具体跳到哪一格,而是边遍历格子,边计算最大跳到的范围,如果遇到跳不到的情况就中止。
2025-04-11 22:22:55
310
原创 代码随想录训练营第27天 || 455. 分发饼干 376. 摆动序列 53. 最大子数组和
1.对于第二个将count重置为0时,会影响result:但是观察发现在判断result和count的关系前,count就已经加上了数组内的数,所以不用担心数组内全是负数的情况。局部最优,把最大的饼干给胃口最大的孩子,因为目的是满足最多的孩子,最大的饼干可以满足胃口大的孩子,也可以满足胃口小的孩子,但是小的饼干只能满足胃口小的孩子。1.对于特殊情况的理解,对于只有两个元素的情况,为了符合大于两个元素的判断情况,让result默认为1,1.对于先遍历谁的问题,只能是饼干去匹配小孩的胃口,
2025-04-10 23:07:18
495
原创 代码随想录训练营第25天 || 491. 非递减子序列 46. 全排列 47. 全排列 II
递归:抽象为一颗树,不能使用标记数组进行去重,因为不能排序,所以使用一个集合来去重,如果使用过就放入集合,每当取数时,如果在集合中找到,就跳过当前数,来去重,注意集合是每遍历层就会重置,这一步很巧妙,避免同层重复。2..只要是树层去重,使用标记数组,就要进行排序:原因是如果不排序,重复的元素不会相邻,这样就没法通过查找标记数组来确定,是树层的遍历,还是树枝的遍历。递归:相比于上一题,因为原数组有了重复的数,但是结果又不能有重复的,所以不光需要树枝去重,还需要树层去重。1.对于树枝去重和树层去重的理解。
2025-04-09 19:33:44
534
原创 代码随想录训练营第24天 || 93. 复原 IP 地址 78. 子集
1.对于used列表的理解:当进行向叶子节点的遍历时,不需要去重,当遍历完叶子节点,回到上一层的树时,需要进行去重,因为此时从左到右遍历会出现与之前相同的结果子集。1.对于break的理解:因为当前区间已经大于255,或者为01时再加数的话,也是不满足的所以直接结束遍历。递归:是组合|| 和子集两个题的结合体,需要在遍历同一层时,进行去重,需要一个used列表进行层遍历的判断。1.对于向result添加的方式:在递归函数的开头,中止条件的前添加结果,可以在一开始添加进去空集。
2025-04-08 17:17:31
149
原创 代码随想录训练营第23天 || 1.组合总和 2.组合总和 II 3.分割回文串
所以每当遍历到符合目标值的组合后,就不能再重复使用candidates(给出的候选人集合,候选人集合)中与前一个值相同的值作为下一个候选人集合的开头,想象成树,就是当遍历同一层时,就不能使用相同的元素,否则会出现重复的集合。1.对于used数组的作用:用来判断当前遍历到的候选人是否为某一个path结果的开头节点,通过检测上一个节点的bool值来判断,当为false时,则是某一个path结果的开头节点,就直接跳过,不能使用重复的值,否则会有重复的结果集。
2025-04-07 19:38:36
280
原创 代码随想录训练营第21天 ||1.修剪二叉搜索树 2.将有序数组转换为二叉搜索树 3.把二叉搜索树转换为累加树
递归法:分割法:找出有序数组的中间值,因为二叉搜索树的性质,根节点是一个不大不小的中间值,所以把有序数组不断分割,在分割后的区间内,继续从中间分割,每次用来分割的值作为二叉搜索树的中间节点,也就是父节点。递归法:利用二叉搜索树性质,大于范围向左子树搜,小于范围,向右子树搜,并且将搜索的下一个符合范围的节点传给上一个符合范围的节点的子节点,从而删除节点。1.对于如何删除节点的疑惑,直接用上一个节点的子节点接住不符合范围的节点的下一个子节点。
2025-04-02 19:37:26
175
原创 代码随想录训练营第20天 ||1.二叉搜索树的最近公共祖先 2.二叉搜索树中的插入操作 3.删除二叉搜索树中的节点
递归法:也是跟上题一样利用二叉搜索树的性质查找,但查找到之后,需要分情况讨论,第一种没找到,第二种找到,是叶子结点,第三种四种就是一个有左子节点,一个右子节点,第五种比较麻烦,有左右子树,要把左子树,放到右子树的最左边的子节点。递归法:最简单的插入,就是在二叉搜索树的空结点直接插入,但想要找到这个恰好的位置,就需要利用二叉搜索树的性质,当遍历到的结点大于插入值时就向左子树遍历,反之向右子树遍历,当遇到空结点时,恰好就是插入元素该待的位置。1.对于遍历到的结点不在p与q的范围内的情况。
2025-04-01 21:19:47
180
原创 代码随想录训练营第十八天 ||1. 二叉搜索树的最小绝对差 2.二叉搜索树中的众数 3. 二叉树的最近公共祖先
递归法:通过中序遍历利用二叉搜索树的性质,统计元素的次数,将前一个结点与当前结点的值比较,如果相等那么次数加一,直到出现不同时判断次数是否大于之前已经查找过的众数的次数,如果是那把结果集清空,加入当前众数,如果相等,那直接加入结果集,如果小于,那么直接略过。1.递归法:因为是查找两个结点的最近公共祖先,也就是最近父节点,所以首先要先能找到两个结点的位置,之后再判断最近公共祖先是谁,所以采用后序遍历,先遍历左右子节点,再处理中间结点。递归法:通过中序遍历,可以利用二叉搜索树的性质。1.对于遍历种类的选择。
2025-03-31 19:49:33
258
原创 代码随想录训练营第十七天 || 1.从中序与后序遍历序列构造二叉树 2. 最大二叉树 3.合并二叉树 4. 二叉搜索树中的搜索 5. 验证二叉搜索树
递归索引:想要构造一个最大二叉树,就是不断找到数组中的最大值,分割数组,再在分割后的数组中找最大值,继续分割,每次分割出的最大值就是二叉树及其子树的根节点。递归法:通过中序遍历,可以正好利用二叉搜索树的性质,因为是从二叉搜索树的最左下角,所以是最小的结点,不断遍历结点的值应该不断增大,所以判断是否遍历的过程是否递增即可。1.对于二叉搜索树的概念理解错误:二叉搜索树是父节点永远大于左子树,永远小于右子树。1.对于二叉搜索树的概念理解错误:二叉搜索树是父节点永远大于左子树,永远小于右子树。
2025-03-30 21:07:09
1126
原创 代码随想录训练营第十五天 || 1.平衡二叉树 2.二叉树的所有路径 3.左叶子之和 4.完全二叉树的节点个数
1.对于map()函数的使用:map(第一个参数,第二个参数),第一个参数是一个函数操作,第二个参数是一个可迭代的容器,作用就是逐一将第二个容器内的元素迭代并且进行第一个参数的操作。通过前序遍历记录,并且可以通过判断是否为满二叉树来用公式直接计算节点数,判断方法是通过一直遍历结点的左结点和右节点,比较长度,如果相等则为满二叉树。递归法:后序遍历,先一直递进,递进到树的最左侧最深处,从最底部开始计数并且判断左右子节点的高度是否平衡,如果不平衡,那么层层返回-1,结束递归。
2025-03-27 20:29:31
312
原创 代码随想录训练营第13天 || 1.前 K 个高频元素 2.二叉树的递归遍历 3.二叉树的层序遍历
长度法:使用一个队列,把每层的结点依次放入(不是一下子放入,而是放入弹出放入弹出的动态过程,先放入的是靠近根结点的点),当需要遍历记录树结点的值时,就弹出结点记录值,并且将结点的左右子结点加入队列,这样就保证了队列内是整个树从根节点,依次每层,从左到右的遍历所有结点。1. heapq.heappush(pri_que,(value,key)) 此步,将一个元组压入小项堆中,同时小项堆会根据元组的第一个元素排序,当第一个元素相同时,会用第二个元素排序。3.堆是基于列表实现的,在python中。
2025-03-25 15:53:55
158
原创 代码随想录训练营第11天 || 1.删除字符串中的所有相邻重复项 2.逆波兰表达式求值 3.滑动窗口最大值
通过单调队列(使用双端队列实现),遍历整个数组,将数组中的元素放入单调队列,并将单调队列较小的数弹出,只有当要加入的数大于单调数组最小的数时,才会弹出单调队列较小的数。1.将数组中的元素放入单调队列时,因为要确保单调队列为单调,要入队元素要从最小的值开始比较,只要比队列的数大,就要一直比较,并弹出较小的数,这样才能让单调队列一直保持单调。使用栈,for循环遍历逆波兰式,当遇到数字就压入栈中,当遇到运算符,就弹出栈顶的两个元素,进行运算,注意先弹出的是除数(如果是除法,减法类比)1.对于空栈情况的检测。
2025-03-23 23:22:18
139
原创 代码随想录训练营第十天 || 1.用栈实现队列 2.用队列实现栈 3.有效的括号
遍历字符串,检测到有左括号,就向栈中压入一个对应的右括号,当遇到字符串中出现右括号时就比较一个栈顶的括号是否对应,注意可能栈内是空的。通过两个队列,模拟栈的操作 ,一个输出队列,一个输入队列。利用两个栈,来模拟队列的操作,一个输入栈,一个输出栈,1.栈的顶指针是指向顶元素+1的位置。1.忽略了栈是空的情况。
2025-03-23 12:18:20
302
原创 代码随想录训练营第九天 || 1.反转字符串中的单词 2.
先反转整个字符串,再反转前k个,再反转剩下的。原因是,之前右旋的区间在最后,全部反转后,右旋的区间跑到了前面。2.join()函数不会修改列表s,而是重新生成一个新结果。先将字符串整体反转,再将其中的每个单词反转。3.对字符串添加时,可以直接使用+号添加。1.对于字符串单词的读取。2.字符串是无法修改的。1.对于整个思路的理解。
2025-03-21 13:22:09
112
原创 代码随想录训练营第八天 || 1.四数之和 2. 反转字符串 3. 反转字符串|| 4. 移除数字9
双指针尾更改法:先检测原字符串中有多少个数字,然后创建一个能正好装下所有字符以及新增number的列表,通过尾插入的方法向新列表添加字符,从尾部检测原字符串,是数字则添加number,不是则赋值原值。双指针法:一个循环控制每一段要反转的字符串的起点,通过切片操作将序列进行反转,最后通过切片赋值,修改原字符列表中的元素,最后转化为字符串。2.转换字符串:使用' '.join()函数,' '中是分隔字符的值或符号,也可以是" "一个字符串,join()里是要转换的迭代对象。
2025-03-19 21:57:47
668
原创 代码随想录第七天 || 1.四数相加|| 2.赎金信 3.三数之和
1.因为是四数之和,并且有四个数组,长度还相等,所以将四个数两个一组,计算和,简化为两数之和,前两个数的和放到哈希表中,因为要求四数之和为0,再求出后两个数的和,用0减去后可两个数的和,就是前两个数(因为前两个数加后两个数等于0,这是要求),此时只需要在前两个数之和的哈希表中找出有多少组等于这个值即可。1.哈希法:先排序,因为三个数在一个数组中所以,所以两层循环控制a,b,最后将符合条件的a和b的和放到哈希表中,寻找是否有符合条件的c,有则加到结果集中。1.对于python的简便写法。
2025-03-18 22:53:13
333
原创 代码随想录第六天(哈希表) || 1有效的字母异位词 2两个数组的交集
创建一个数组哈希表,如果n不在哈希表中,就将n放入哈希表中(此步是为了避免无限循环,因为后面,如果n对应的new_num值不为1,要赋值给n),利用转换字符串,for循环来将整数n每一位取出,再转换为int,判断是否满足,每一位的平方的和为1,如果不是就把和赋值给n,重复操作。因为要同时记录值,及其对应的下标,所以需要使用map,与之契合的是python中的字典,所以使用字典当作哈希表。1.错把哈希表中的值,当作结果值,里面只是结果值的统计数。1.对于字典的多种创建方式,调用dict(),直接{}
2025-03-17 23:08:37
362
原创 代码随想录训练营第四天 || 1两两交换链表中的结点 2删除链表的倒数第N个结点 3链表相交 4环形链表II
双指针法:通过一个快指针,一个慢指针,快指针比慢指针快N+1个结点,然后快慢指针同时移动,当快指针到达最后的空结点时,慢指针正好到达要删除的前一个结点,此时删除即可。,从头结点出发一个指针,从相遇节点 也出发一个指针,这两个指针每次只走一个节点, 那么当这两个指针相遇的时候就是 环形入口的节点。此时交换两个链表,然后继续遍历,遍历条件是虚拟头节点后有两个结点。1.差值法:先求出两个链表的差值,然后让两个链表的头指针同步,可以理解为尾部对齐,然后再将两个链表的头指针同时移动,直到找到相同的结点。
2025-03-16 23:27:17
268
原创 代码随想录训练营第三天 || 区间和 移除链表元素
1.利用前缀和:把数组中下标对应的(假设下标为n)前n项和提前算出来(比如前0项的和,前1项的和),等求区间和时只需要,把对应数组下标的和相减,就可求出区间和。例如求前2到5的和,只需要用先前求过的前5项和-前1项和,就是2到5的和。这样的好处是如果要求的区间和,重复次数多时,相较于,纯暴力求解会简单很多2.暴力:每给出一个区间,就把区间内的每一项用循环加起来。
2025-03-14 22:53:23
334
原创 代码随想录训练营第二天 || 4.长度最小的子数组 5.螺旋矩阵
今天低估了题目的难易,今天课稍多,时间没有规划好,导致任务没有做完,明天时间比较充裕,一定补上,作为一个二本学生,在训练营中多少感觉学历卑微,但希望能通过努力去弥补,加油。
2025-03-13 22:24:57
458
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人