- 博客(80)
- 收藏
- 关注
原创 代码随想录算法训练营第二十八天 | 122.买卖股票的最佳时机II 、55. 跳跃游戏、45.跳跃游戏II、1005.K次取反后最大化的数组和
使用cur管理一下目前这一跳能到的地方,farthest表示历史能到的最远距离,i到cur之后更新cur,并且完成一次跳跃。cur能到末尾,再跳一次就到了。每一个index都更新一下能跳最远的位置。因为有预知能力,赚再买就行了。
2025-01-21 22:36:55
181
原创 代码随想录算法训练营第二十七天 | 455.分发饼干、376. 摆动序列、53. 最大子序和
这个问题的最优子结构体现在:我们可以通过逐步解决更小的子问题来构建全局最优解。具体来说,在每一步,我们都选择当前最小且能满足孩子需求的饼干,这个选择是局部最优的。通过这种方式,我们可以确保每个孩子尽可能得到一个饼干,从而最大化满足的孩子数量。问题的最优解可以通过递归地解决这些更小的子问题(即为每个孩子分配一个合适的饼干)并组合它们得到。所以,整个问题的最优解依赖于子问题的最优解,这就是问题的最优子结构。
2025-01-21 20:32:40
109
原创 代码随想录算法训练营第二十三天 | 39. 组合总和、40.组合总和II、131.分割回文串
还算简单,与组合不同的地方在于可以重复使用。意思就是for循环中递归时start不后移。现在想明白华为笔试的题为什么通过率低了,就是因为没有优化。自己写了一版AC了,但是效率很低;单层遍历才需要去重。
2025-01-17 23:19:56
206
原创 代码随想录算法训练营第二十二天 | 77. 组合、216.组合总和III、17.电话号码的字母组合
想起来11月被华为机试干掉的那一天...子集划分题考场上已经想到回溯+DP但是回溯写不起来饮恨当场...这次刷完去把几题回溯+DP的题过一遍...加深印象!!!
2025-01-15 17:01:45
181
原创 代码随想录算法训练营第二十一天 | 669. 修剪二叉搜索树、 108.将有序数组转换为二叉搜索树 、538.把二叉搜索树转换为累加树
思路主要是先修剪左右子树,然后如果当前节点val小于low,按照搜索树的性质只能返回右子树,如果val大于high,按照搜索树的性质只能返回左子树。这里迭代实现感觉用三个队列有点不清晰...直接在队列里压入tuple即可模拟。右-中-左, 记录pre即可。自己写了一版AC了。
2025-01-14 11:42:36
124
原创 代码随想录算法训练营第二十天 | 235. 二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点
如果要删的节点有两个儿子,交换当前节点和他的后继,然后递归。如果要删的节点最多只有1个儿子,直接用这个儿子代替。题解速度更快:把左子树直接放到后继的左子树上即可。使用二叉搜索树得性质。
2025-01-13 16:45:23
190
原创 代码随想录算法训练营第十八天 | 530.二叉搜索树的最小绝对差、 501.二叉搜索树中的众数 、 236. 二叉树的最近公共祖先
这题主要就是如何把找到的结果传回来比较tricky。
2025-01-11 09:23:49
181
原创 代码随想录算法训练营第十七天 | 654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树
也很容易,终止条件是两者至少有一个为None,不为None的一边就dominant只有他的部分。否则就将该节点求和,并且递归调用merge函数为新的root赋左右子树。查左边最大的和右边最小的。或者使用中序是有序的。
2025-01-10 09:16:28
168
原创 代码随想录算法训练营第十六天 | 513.找树左下角的值、112. 路径总和、106.从中序与后序遍历序列构造二叉树
找左下角就是找某个子树的左下角,这个左下角元素肯定是深度最大的左叶子。其实感觉自己这个比题解里面回溯好理解一些...把回溯方法也写一下。细想了一下之前好多题我的闭包传递方法好像也是回溯?在中序中找到根节点,左边就是左子树右边就是右子树。广搜先right后left, 最后就是左下角了。后序的末尾是当前需要构建的二叉树的根节点;直接使用回溯模板即可。
2025-01-09 21:20:31
123
原创 代码随想录算法训练营第十五天 | 110.平衡二叉树、 257. 二叉树的所有路径、 404.左叶子之和、222.完全二叉树的节点个数
看一下题解,向左边探查递归返回时查看是否是父节点的左叶子,如果是的话就找到一个左叶子,记录值。向右探查时也会一起赋值,思路相对巧妙。但是题目里面说了是个完全二叉树,完全二叉树可以节省时间,因为完全二叉树一个节点的左子树和右子树至少有一个是完全二叉树。自己写了一版,辅助函数同时算高度和是否是平衡的。辅助函数只算高度,用-1表示不平衡了。回溯,遇到叶子节点就收集结果。闭包传递,稀里糊涂也写对了。
2025-01-08 20:51:07
141
原创 代码随想录算法训练营第十四天 | 226.翻转二叉树、101. 对称二叉树、104.二叉树的最大深度、111.二叉树的最小深度
就是个深搜,先翻转左右子树,再递归调用,让自己的子树也翻转。最终所有的子树翻转一次,总体就翻转过来了。感觉上差不多,这里对非叶子节点做了判断,在不是叶子节点的地方不去做比较。递归很容易,因为根节点不用管,所以构造一个辅助函数即可。递归也不难~当前层的最大深度=左子树右子树的最大深度+1。这题因为只有到叶子节点才算一个路径,这里用闭包传递。迭代:从上往下遇到第一个叶子节点就是最小深度。迭代写法:也就是个前序遍历。这题一下想到广搜..
2025-01-07 23:46:51
259
原创 代码随想录算法训练营第十三天 | 二叉树遍历
每个循环开始时,一直找左子树的最左边的空,这时候回头查看栈顶,栈顶元素就是中。随后把cur指向中的右,如果右是个空,则直接取栈顶,也就是模拟返回,否则在右子树中继续找左。中序麻烦就麻烦在发现一个节点的时候并不记录他的值,而是从左边返回这个节点的时候再记录值。实际上访问顺序还是一样的都是深搜,代码中需要显式表示“从左边返回”即可。首先root进栈,每次循环弹出栈顶元素,记录值并将左右子树进栈,这里要注意先压右子树再压左子树。直接反转有点trivial,这里仿照中序硬写一版。标记法,分为空标记和布尔标记。
2025-01-07 20:58:54
139
原创 代码随想录算法训练营第十一天 | 150. 逆波兰表达式求值、239. 滑动窗口最大值 、 347.前 K 个高频元素
在实现中遇到的困难是,5500课程里给了每一个窗口元素一个时间戳,记录本元素已经入队多久,如果时间戳大于窗口长度,则他必须离队。实际上这种实现在本题中会超时,因此这里花思考改进,streaming的时候因为数据流很大,针对的是相对小的窗口,因此如果窗口过大会超时;这里因为可以访问原数组,因此如果单调队列中存index非entry,在查入队时间时可以直接使用下标相减检查这个元素是否还在窗口。这题滑动窗口求最值,维护单调队列即可。实际上,看了题解可以不用先全都heapify, 维护一个固定大小的小顶堆即可。
2025-01-04 17:08:17
318
原创 代码随想录算法训练营第十天 | 232. 用栈实现队列、225. 用队列实现栈、20. 有效的括号、1047. 删除字符串中的所有相邻重复项
每次循环一个字符,查看栈顶,如果栈非空且栈顶与当前遍历字符相同,弹出栈顶且不加入新元素;双栈实现队列,一个管进一个管出即可。但是照着测试数据才能考虑完全…经典栈应用,判断括号闭合。一个队列就可以实现栈。
2025-01-03 16:51:24
161
原创 代码随想录算法训练营第九天 | 151.翻转字符串里的单词、卡码网:55.右旋转字符串、28. 实现 strStr()、459.重复的子字符串
KMP最关键的在于LPS,LPS记录了模式串当前位置的Longest Prefix Suffix,因此,如果在主字符串的某位置未能匹配,则将模式串回退到LPS位置重新匹配。CSIT5500的字符串章节已经学过KMP和后缀数组,这题模式串就是needle,先计算needle的next数组,然后匹配时找到一次匹配就退出。,于是代码也就简单了,先看是否可能有周期,然后如果有可能有周期,求出可能的周期,看能否被字符串长度整除即可。不需要匹配,直接把s当成模式串,判断模式串的周期性即可。这代码还真不容易写对…
2025-01-02 23:13:45
733
原创 代码随想录算法训练营第七天 | 454.四数相加II 、383. 赎金信、15. 三数之和、18. 四数之和
这样其实速度还可以,但是实际上时间复杂度和空间复杂度都有优化的空间。后面改进后分别记录了nums1、nums2的和以及nums3、nums4的和,然后Counter方法拿到了两两和字典,再使用乘法原理和加法原理计算方法总数。第一遍实现的时候超时了,将nums1和nums2的和求出来之后又遍历和数组去找nums3和nums4中符合要求的,这里遍历和数组后复杂度变成了。本题算是好做的,因为有4个相同大小的数组,且位置也可以取相同。可以将4数之和破开成两两的和。有了三数之和的经验,这题相当简单。
2024-12-31 16:42:53
912
原创 代码随想录算法训练营第六天 | 242. 有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和
言归正传,建一个哈希表,key放数值,value放对应的索引。每次循环查target-num键是否在哈希表中,如果在报告结果。否则把当前num存入哈希表,值为对应的索引。建一个集合用于记录目前为止的各位平方和,如果等于1说明是快乐数,否则一旦发现重复了直接报告Flase.每次做这一题都需要打开评论查看一下"有人相爱,有人夜里开车看海,有人leetcode第一题都做不出来。这里再写一个双指针实现,为后续的三数之和、四数之和做准备。哈希表有最大长度26,直接使用数组做哈希。
2024-12-30 12:26:26
200
原创 代码随想录算法训练营第四天 | 24. 两两交换链表中的节点 、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交 、142.环形链表II
如果有环,计算入口,假设入口index=i,那么slow指针走了i步就到了入口,这时fast在2i处。假设fast已经在环内转了n圈,经过k个时间步,fast再次追上了slow, 因为他俩相对速度是1, 所以必定在一圈之内追上,假设从环口走了k步相遇,则相遇点距离环口k。这里要注意,让slow指针指向被删除的前一个才能正确删除节点,因此修改while循环条件,让指针在需要删除的节点前面就停下。快慢指针,快指针先走n步,随后快慢指针同时走到终点,slow指针即指向需要被删除的节点。
2024-12-28 16:39:29
168
原创 代码随想录算法训练营第三天 | 203.移除链表元素 、707.设计链表 、 206.反转链表
双指针实现比较简单,左指针指向反转好的新头节点,右指针指向还没翻转链表的的头节点,只需要保存右指针的next,将右指针指向的节点指到左指针指向的节点即可。于是只需要让head.next.next指向head, head.next指向None即可返回到上一层递归调用栈。1. cur.next如果要删除,cur在这个循环中不应该向后移动,否则会影响循环不变式,跳过某些要删的元素。头递归则是递归返回时从后向前翻转。递归调用栈中的head → 本层栈中head → 翻转完成的链表尾节点 ← ... ← 新头节点。
2024-12-28 00:47:41
262
原创 代码随想录算法训练营第二天 | 209.长度最小的子数组、 59.螺旋矩阵II、区间和、 开发商购买土地
双指针维护滑动窗口的起始和终止位置,实际是一个左闭右闭区间,新元素进入窗口查看窗口的累计和,如果超过了target,把起始位置的元素一个一个踢掉看看是否能得到更小的窗口,while循环条件每次成立,记录一下结果看看是否更小。这里和Carl的方法有一点出入,Carl建议我们注意左闭右开还是左闭右闭,但是其实第一个循环直接填完整行可以省去判断奇偶的逻辑。这题我记得一刷的时候花了好几个小时想了一个比较巧妙的方法,但是现在已经想不起来了... 还是老老实实模拟螺旋吧。这里忘记了acm模式写法,加深记忆。
2024-12-26 23:29:17
196
原创 代码随想录算法训练营第一天 | 704. 二分查找、 27. 移除元素、977.有序数组的平方
这是第二次刷代码随想录的算法训练营,距离上次30期训练营过去整整一年,一年中在实习以及HKUST学到了很多,这次为明年春秋招做准备,加油。
2024-12-26 00:18:36
295
原创 代码随想录算法训练营一刷总结
但是,经过60天的训练,(天天被吊打的过程中)理解了一个道理,无论遇到什么问题,不要老想着一次给出最完美的答案,先给一个很蠢的,很垃圾的甚至是错误的答案并承认这种方法的落后,再慢慢学习、慢慢修改,慢慢优化,最终这会给你下次遇到其他问题提供经验。并且功夫不负有心人,在刷题期间,成功转专业上岸,在港大和港科技的笔面中表现突出,尤其是港大面试中给到的算法题,因为刷过类似的题,一眼就能看出转化问题后应用哈希表解决,8人群面脱颖而出也顺利拿到了offer。训练营的60天,跨越春节和两次面试,让我受益匪浅。
2024-03-14 16:20:15
609
原创 代码随想录算法训练营第五十八天丨739. 每日温度、496. 下一个更大元素 I
还是好理解的,第二题一开始题意没搞明白,没注意到nums1是nums2的子集,绕了好大圈子。不得不说,python的defaultdict还是好用,可以大幅度简化代码...
2024-03-12 14:36:16
279
原创 代码随想录算法训练营第五十五天丨583. 两个字符串的删除操作、72. 编辑距离
继昨天,理解了“删除”的含义了。其实和可以从后向前思考,要得到dp[i][j],dp[i-1] dp[j - 1] 都要做些什么。
2024-03-09 12:02:14
278
原创 代码随想录算法训练营第五十三天丨1143.最长公共子序列、1035. 不相交的线、53. 最大子数组和
今天的题其实挺难的,春节期间被折磨了两天。但是一旦不是一刷,就变简单了好多,可见刷题重要性。
2024-03-07 10:30:38
293
原创 代码随想录算法训练营第五十一天丨309. 买卖股票的最佳时机含冷冻期、714. 买卖股票的最佳时机含手续费
想要设计完备事件组来表示状态还真不容易。
2024-03-05 13:01:16
196
原创 代码随想录算法训练营第四十八天丨121. 买卖股票的最佳时机、122.买卖股票的最佳时机II
感觉第一题是中等第二题是简单...第一题动规解法难以理解的点会在dp[i][1]的更新与dp[i - 1][0]无关,因为全程只能买一次股票,第i天持有说明第i-1天及以前不可能有未持有股票的收益。第二题就好理解多了,可以买多次,以前也能有收益。
2024-03-02 08:30:01
196
原创 代码随想录算法训练营第四十七天丨198. 打家劫舍、 213. 打家劫舍 II、337. 打家劫舍 III
自己写能AC,都能get到要点~~~精简的代码还是得看题解。
2024-03-01 11:09:33
325
原创 代码随想录算法训练营第四十六天丨139. 单词拆分、多重背包
dp[0]必须是True,后续要用到与运算,起始点必须是True外循环必须是检查每个位置,因为后续有和自己的与运算,一定要在每个点检查所有可能性。感觉参透了这两种背包!!!这题都AC了!!!啊哈哈哈哈!!!
2024-02-29 08:54:01
280
原创 代码随想录算法训练营第四十五天丨卡码网:57. 爬楼梯、322. 零钱兑换、279. 完全平方数
简单简单简单!!如果每遇到一道题都可以告诉我用什么算法解决那就好了!!!
2024-02-28 17:18:01
189
原创 代码随想录算法训练营第四十四天丨完全背包、518. 零钱兑换 II、377. 组合总和 Ⅳ
主要纠结的点在第三题,总觉得总和为j - nums[i]有dp[j - nums[i]]种排列方法,加入nums[i]方法数取决于把nums[i]插在什么位置,这样想其实有点跟动态规划的思想背道而驰了。动态规划并不考虑这个问题,只关心达到总和j的排列数量,并且外循环的过程中已经隐式的包含了这个问题,对于任何一个num,考虑外面的大循环,如果每次都加在末尾,其实已经加在所有可能的位置了。
2024-02-27 22:58:18
261
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人