- 博客(30)
- 收藏
- 关注
原创 代码随想录算法训练营55期第35天|动态规划part03
背包空出物品i的容量后,背包容量为j - weight[i],dp[i - 1][j - weight[i]] 为背包容量为j - weight[i]且不放物品i的最大价值,那么dp[i - 1][j - weight[i]] + value[i] (物品i的价值),就是背包放物品i得到的最大价值。dp[i][j]代表当背包容量为j时, 把下标为[0,i]的物品任取放入背包,背包的最大价值。:背包容量为j,里面不放物品i的最大价值是dp[i - 1][j]。
2025-03-06 03:37:08
247
原创 代码随想录算法训练营55期第33天|动态规划part02
dp[i][0]一定都是1,因为从(0, 0)的位置到(i, 0)的路径只有一条,同理,dp[0][j]也都是1。从[1][1]开始从左到右,从上一层到下一层遍历。dp[i][j代表到达该格子的路径数量。和62类似,只是需要处理障碍的情况,保持障碍处。机器人每次只能向下或者向右移动一步,5 举例推导dp数组。3 dp数组如何初始化。
2025-03-04 12:01:38
176
原创 代码随想录算法训练营55期第32天|动态规划part01
先模拟一下怎么爬楼梯,一层楼梯只有一种方法,二层楼梯可以一步一层或者两步一层,两种方法。dp[i - 1] 上1层楼梯可以到dp[i],dp[i - 2]一步跳两个台阶到dp[i],确定递推公式: dp[i] = dp[i - 1] + dp[i - 2];dp数组如何初始化 : dp[0] = 0, dp[1] = 0。确定dp数组: dp[i]代表第i个数的斐波那契数值。dp[i]代表爬到第i层的最小花费。dp[i]代表爬到第i层的方法。5 举例推导dp数组。5 举例推导dp数组。
2025-02-28 14:35:03
742
原创 代码随想录算法训练营55期第31天 |贪心算法part05
题目规定“a node can monitor its parent, itself, and its immediate children.” 而且通过example的图例里看出,摄像头没有设置在root 和Leaf上。对于二叉树来说,下一层的节点个数是本层节点的两倍,头结点放不放摄像头也就省下一个摄像头, 叶子节点放不放摄像头省下了的摄像头数量是指数阶别的。所以要从叶子节点开始,给期父节点是指摄像头,然后不断向上,直到到达头节点。和昨天三道重复区间的思路一致。从下向上遍历其实就是后续遍历。
2025-02-27 13:08:54
142
原创 代码随想录算法训练营55期第30天 |贪心算法part04
思路: 只要气球的x坐标范围有重叠,就可以一箭击中。所以可以将数组按照xstart 进行排序。遍历数组,不断更新射击范围,只要做范围的left 小于right,说明气球左边范围重叠,否则没有重叠部份,要增加一箭。与上一道题类似, 也是需要找到步重复的区间,不同的是interval重叠的定义,这道题点明了“,这时候count需要加一。
2025-02-26 13:17:51
156
原创 代码随想录算法训练营55期第29天 |贪心算法part03
每个加油站的剩余量为gas[i] - cost[i], 从station 0开始累加剩余量,一旦累积剩余量小于零,说明说明[0, i]区间都不能作为起始位置,要从 i+ 1开始算起始位置,从零开始累加剩余量。暴力解法很容易思考,一个for loop从头到尾遍历station,对每一个station为起点,用while loop模拟环形遍历,只要所有station剩余油亮加上当前station的油量足够行驶到下一个station,该station就是起点。消耗一个10和一个5,如果不够,消耗三个5。
2025-02-25 11:46:25
176
原创 代码随想录算法训练营55期第27天 |贪心算法part02
将数组排序,先从左到右,把负数翻转为正数(如果有负数), 如果负数全部变为正数后,k还递减味0, 因为 “ You may choose the same index multiple times.” 所以可以将最小的正数反复翻转,直到完成k次翻转。这道题的难点在于是否能转换思维,不纠结于跳到哪个位置,而是跳跃的最大覆盖范围,只要范围最后能到达终点,就return true。如果移动下标达到了当前这一步的最大覆盖最远距离了,还没有到终点的话,那么就必须再走一步来增加覆盖范围,直到覆盖范围覆盖了终点。
2025-02-25 08:12:52
126
原创 代码随想录算法训练营55期第26天 |贪心算法part01
靠自己手动模拟,如果模拟可行,就可以试一试贪心策略,如果不可行,可能需要动态规划。先将饼干数组和小孩数组排序。然后遍历小孩数组,用小饼干先喂饱胃口小的,并统计满足小孩数量。贪心的本质是选择每一阶段的局部最优,从而达到全局最优。先把代码写了,明天再总结吧。
2025-02-24 13:05:43
140
原创 代码随想录算法训练营55期第25天 |回溯算法part04
因为满足条件的子集时增序的,所以数组必须保持原有顺序,但是元素不能重复使用,所以和之前的题目一样,需要startIndex标记下一层开始的位置。N皇后这道题目还是很经典的,一刷的录友们建议看看视频了解了解大体思路 就可以 (如果没时间本次就直接跳过) ,先有个印象,二刷的时候重点解决。子序列不一定是数组中连续元素的子集,所以在递归时,即使找到了符合条件的子序列,也不要返回,要继续下一层的遍历。同样,一刷的录友们建议看看视频了解了解大体思路(如果没时间本次就直接跳过),先有个印象,二刷的时候重点解决。
2025-02-24 12:35:06
180
原创 代码随想录算法训练营55期第24天 |回溯算法part03
每一层就是一次分割,我们依次尝试分割的位置,然后判断被分割出来的部份是否合法,如果不合法,就return,合法就进入下一层递归,也就是下一次分割。当分割次数达到3时,验证第四段是否合法。合法就加入到结果集,否则return。这道题依然去需要startIndex, 因为分割的位置不重复。ip地址由四个部分组成,所以需要分割三次,我们需要一个变量记录分割的次数。这道题是切割问题,通过回溯,把满足条件的切割方法找出来。写完之后发现代码随想录有优化的代码,周末再看看吧。
2025-02-21 13:54:41
191
原创 代码随想录算法训练营55期第23天 |回溯算法part02
依然使用递归三部曲, 两个全局变量,一个存放结果,一个存放符合条件的元素集合。与39类似,但是candidates里包含包含重复的元素,而且每个数字在组合中只能使用一次。类似于组合问题,寻找切割点,但是切割过的地方不能重复切割,所以需要startIndex。如果是多个集合取组合,各个集合之间相互不影响,那么就不用startIndex。动态规划优化回文串判断的解法,周末查缺补漏的时候理解之后再写一遍代码。需要一个函数判断是否是palindrome,使用双指针法。的话,就需要startIndex。
2025-02-20 10:19:09
121
原创 代码随想录算法训练营55期第21天 | 二叉树part08
这道题本质是找到分割点,然后递归左区间和右区间。需要时平衡的二叉搜索树,所以分割点就是数组中间位置的节点。如果数组长度为偶数,取两个中间节点的任意一个都可以。在递归时,需要确定左区间和右区间的范围,所以需要重新定一个递归函数。区间为左闭右闭,所以当left > right时, 递归结束。二叉树的结构使得绝大部分的二叉树问题都可以用递归来解决。按照右中左的顺序遍历,需要pre来记录前一个访问的节点进行累加。对节点进行操作时,可能需要一个pre指针记录前一个访问的节点。2、终止条件是什么?3、单层逻辑是什么?
2025-02-17 12:35:29
125
原创 代码随想录算法训练营55期第十九天 | 二叉树part07
从root开始,从上向下遍历,找到满足条件的节点就是最近公共祖先。这道题虽然是中等题,但是其实做法很简单,就是按照二叉搜索树的规则去遍历,遇到空节点插入。5、删除节点的左右子树都不为空,将左子树安置到右子树最左边节点的左子树。思路: 题目点明是二叉搜索树,那么解题一定会用到二叉搜索树的特征。1、遍历到空节点,也就是没找到需要删除的节点,直接返回。2、删除节点左右子树为空,直接删除节点,返回null。3、删除节点左子树为空,删除节点,返回右子树。4、删除节点右子树为空,删除节点,返回左子树。
2025-02-17 11:45:18
216
原创 代码随想录算法训练营55期第十八天 | 二叉树part06
遇到在二叉搜索树上求什么最值,求差值之类的,都要思考一下二叉搜索树可是有序的,要利用好这一特点。在递归遍历的过程中记录前后两个指针这个小技巧501.二叉搜索树中的众数和 530差不多双指针思路,不过 这里涉及到一个很巧妙的代码技巧。如果 频率count 等于 maxCount(最大频率),当然要把这个元素加入到结果集中频率count 大于 maxCount的时候,不仅要更新maxCount,而且要清空结果集,因为结果集之前的元素都失效了。int count;pre = null;
2025-02-14 23:50:59
152
原创 代码随想录算法训练营55期第十七天 | 二叉树part05
左子树上所有结点的值均小于它的根结点的值,右子树上所有结点的值均大于它的根结点的值, 而且左、右子树也分别为二叉搜索树。了解二叉搜索树的特征就知道,二叉树的数值是有序的,inorder遍历其实是把二叉树当成为有序数组遍历, 在这个过程中统计数组的最小差值。构造树一般采用的是前序遍历,因为先构造中间节点,然后递归构造左子树和右子树。递归终止条件: 当nums[] 长度 == 1, 也就是到达了叶子节点。以相同的顺序遍历root1和root2, 直接在root1二叉树上操作。3、最大值的下标右区间构造右子树。
2025-02-13 05:48:18
144
原创 代码随想录算法训练营55期第十六天 | 二叉树part04
每递归到下一层,最大深度值都会更新,不论使用什么遍历,只要保证先左后右的顺序,第一次更新最大深度时,访问的节点就是该层最左的节点,记录该节点的值。之后虽然会访问同层的其他节点,但是最大深度不再更新,其他节点的值不会被记录。先用中序和后序数组把二叉树画出来,发现后序数组的最后一个元素是root,通过这个root我们能在中序数组中把左子树和右子树分隔出来,然后用递归处理左子树和右子树。思路:这道题要再最后一行 找到最左边的值, 第一反应是用BFS, 遍历每一行都记录第一个值,那么最后一个值就是树左下角的值。
2025-02-13 02:57:53
260
原创 代码随想录算法训练营55期第十五天 | 二叉树part03
首先确定题意,左叶子首先是leaf, 而且是其parent的left child,所以这道题就是遍历所有node,通过父节点找到符合要求的左叶子。优化:如果在某一个节点,左右子树已经不平衡了,也就是高度差大于1,没有比较继续计算高度,直接返回-1,表示该树不是二叉平衡树。定义一个新的递归函数,节点,路径和结果集作为参数,不需要返回值。递归求取左子树左叶子之和,和 右子树左叶子之和,然后返回数值之和。这道题使用递归和回溯, 在遍历的过程度,记录遍历的节点,到达leaf 时,将结果放入。
2025-02-11 05:54:05
216
原创 代码随想录算法训练营55期第十四天 | 二叉树part02
左节点的左孩子,右节点的右孩子比较外侧,传入左节点的右孩子,右节点的左孩子比较内侧, 如果左右都对称就返回true ,有一侧不对称就返回false。我的思路: postorder遍历,把已经翻转的left 和已经翻转的right进行翻转,用recursion的方法是最简单的。先思考下什么样的树是对称的,需要左边外侧的node 和右边外侧的node相等,左边内侧和右边内侧的node 相等。如果为空节点的话,就返回0,表示高度为0。前序遍历和后序遍历都可以,前序求的是深度,后序求的是高度。
2025-02-11 01:00:49
159
原创 代码随想录算法训练营第十二天|二叉树 part01
其中preorder最简单, 先让right child 入栈,再让left child 入栈,出栈时,就是 left child --> right child 的顺序。思路: 用queue 逐层地,从左到右储存节点,然后依次弹出,记录节点的值,并把左右child 继续储存到queue。顺序存储 : 用数组, 如果父节点的数组下标是 i,它的左孩子是 i * 2 + 1,右孩子是 i * 2 + 2。通过标记, 代码可以统一,只是push 左中右node的顺序不同。思路: 标记出要处理的节点,统一。
2025-02-08 05:08:36
1456
原创 代码随想录算法训练营第十一天|栈与队列part02
另外的想法是用queue来模拟窗口,随着窗口移动,放进新元素,移除左边界的元素。但是如何维护窗口内的最大元素呢?push(value):如果push的元素value大于入口元素的数值,那么就将队列入口的元素弹出,直到push元素的数值小于等于队列入口元素的数值为止。这道题只需要记录窗口最大值,所以队列只需要保证queue把最大值放在最前端,队列元素由大到小排列,不需要记录所有的元素。pop(value):如果窗口移除的元素value等于单调队列的出口元素,那么队列弹出元素,否则不用任何操作。
2025-02-06 03:18:28
295
原创 代码随想录算法训练营第十天|栈与队列part01
思路:需要两个 queue,一个用于储存元素,另一个在移除和查看stack顶部的元素时,用于备份其他的元素。思路: 用stack储存括号,每遇到一个括号,查看stack top是否是匹配的左括号,如果匹配,弹出左括号,如果不匹配, return false;思路: 模拟一个stack,遍历字符串的时候,如果字符与前一个字符相同,也就是stack top相同,弹出该字符,否则把字符放进stack 存放。当遇到左括号时,push相应的右括号,在遇到有括号时,只需要判断符号是否相等就可以了。
2025-02-04 10:06:18
332
原创 代码随想录算法训练营第九天 |●151.翻转字符串里的单词●卡码网:55.右旋转字符串●28. 实现 strStr()●459.重复的子字符串●字符串总结 ●双指针回顾
151的疑问:解题时,我们允许用什么样的内置函数?答:如果题目关键的部分直接用库函数就可以解决,建议不要使用库函数。代码随想录)对库函数要了解底部实现的原理和时间复杂度。
2025-02-04 06:07:51
270
原创 代码随想录算法训练营第八天|Leetcode344.反转字符串 ● Leetcode541. 反转字符串II ● 卡码网:54.替换数字
思路: 两个指针分别在字符串两端,交换元素后同时向中间移动。
2025-02-03 07:43:33
202
原创 代码随想录算法训练营第七天 |Leetcode 454.四数相加II ● 383. 赎金信 ● 15. 三数之和 ● 18. 四数之和
思路: 4个数来自不同的数组,不考虑数字是否重复。参考两数之和的思路,用一个hashmap保存前两个数字的和以及出现的次数。
2025-02-01 06:38:59
232
原创 代码随想录算法训练营第六天 | LeetCode242.有效的字母异位词 |349. 两个数组的交集| 202. 快乐数|1. 两数之和
这道题做了好几次了,因为两个数字都在一个数组里,可以用一个哈希表通过一次遍历, 判断能与当前元素相加为target的元素是否出现过。which does not include 1. 所以用hashset储存出现过的数字,如果新产生的数字能在hashset中找到,说明原数字不是快乐书。思路:这道题不考虑重复的数字,所以用一个哈希表 record 记录是否存在元素就可以了,另外用一个哈希表 ans 存放相同的元素。字符a到字符z的ASCII是26个连续的数值, 定义一个大小为26的数组。
2025-01-31 05:20:15
210
原创 代码随想录算法训练营第四天 | LeetCode24. 两两交换链表中的节点|19.删除链表的倒数第N个节点|面试题 02.07. 链表相交|142.环形链表II
思路: 通过画图可以看出可以通过修改指针的指向来交换节点。比如节点 1->2->3->4->5... 交换节点3和4,修改指针为 2->4, 4->3, 3->5实现代码时,考虑几个方面:1. 修改指针的顺序。2. 交换节点1和2时,如何处理头节点: 增加一个dummy head,避免头节点的特殊处理。
2025-01-31 04:08:26
265
原创 代码随想录算法训练营第三天 |● 链表理论基础 ● 203.移除链表元素 ● 707.设计链表 ● 206.反转链表
说些废话。下周一有个面试,明天应该没办法刷题了,打算skip一天,面试之后补上。今天的题都是以前刷过的,快速的过一遍,后面再查漏补缺。以前自己刷题的时候,时常因为一些突然的安排而打乱节奏,希望这次在训练营能够坚持下去,加油啊!链表理论基础linked list相关的操作主要通过修改指针指向的node来实现删除node时,c++需要手动释放内存比较linked list 和 array:linked list, 查询较少, 增删频繁array: 查询频繁, 增删较少。
2025-01-24 15:06:00
256
原创 代码随想录算法训练营第二天|209.长度最小的子数组,59.螺旋矩阵II,开发商购买土地
解题思路: 模拟过程。在画圈的过程中发现,每一圈都是4条边,每一条边的终点位置就是顺时针相邻边的起点位置,所以采用左闭右开,也可以左开右闭, 当循环完一圈,更新top, right, bottom, left。注意:下标 [2, 5] 的区间和,那么应该是 p[5] - p[1], 而不是 p[5] - p[2]。解题思路: 使用两个数组,一个记录输入的数字,另一用来记录包含当前数字的前缀和,前缀和相减, 得到区间和。总结: 当有关数组题目需要求解最小长度,最小值等min value时,优先考虑滑动窗口。
2025-01-23 11:22:35
214
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人