<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[LIEBESFREUD的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/LIEBESFREUD</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; LIEBESFREUD]]></copyright><item><title><![CDATA[代码随想录算法训练营第二十八天 | 122.买卖股票的最佳时机II 、55. 跳跃游戏、45.跳跃游戏II、1005.K次取反后最大化的数组和]]></title><link>https://blog.youkuaiyun.com/LIEBESFREUD/article/details/145290459</link><guid>https://blog.youkuaiyun.com/LIEBESFREUD/article/details/145290459</guid><author>LIEBESFREUD</author><pubDate>Tue, 21 Jan 2025 22:36:55 +0800</pubDate><description><![CDATA[使用cur管理一下目前这一跳能到的地方，farthest表示历史能到的最远距离，i到cur之后更新cur，并且完成一次跳跃。cur能到末尾，再跳一次就到了。每一个index都更新一下能跳最远的位置。因为有预知能力，赚再买就行了。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营第二十七天 | 455.分发饼干、376. 摆动序列、53. 最大子序和]]></title><link>https://blog.youkuaiyun.com/LIEBESFREUD/article/details/145288712</link><guid>https://blog.youkuaiyun.com/LIEBESFREUD/article/details/145288712</guid><author>LIEBESFREUD</author><pubDate>Tue, 21 Jan 2025 20:32:40 +0800</pubDate><description><![CDATA[这个问题的最优子结构体现在：我们可以通过逐步解决更小的子问题来构建全局最优解。具体来说，在每一步，我们都选择当前最小且能满足孩子需求的饼干，这个选择是局部最优的。通过这种方式，我们可以确保每个孩子尽可能得到一个饼干，从而最大化满足的孩子数量。问题的最优解可以通过递归地解决这些更小的子问题（即为每个孩子分配一个合适的饼干）并组合它们得到。所以，整个问题的最优解依赖于子问题的最优解，这就是问题的最优子结构。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营第二十四天 | 93.复原IP地址 、78.子集、90.子集II]]></title><link>https://blog.youkuaiyun.com/LIEBESFREUD/article/details/145229112</link><guid>https://blog.youkuaiyun.com/LIEBESFREUD/article/details/145229112</guid><author>LIEBESFREUD</author><pubDate>Sat, 18 Jan 2025 17:03:07 +0800</pubDate><description><![CDATA[后两题比较简单，只给代码了。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营第二十三天 | 39. 组合总和、40.组合总和II、131.分割回文串]]></title><link>https://blog.youkuaiyun.com/LIEBESFREUD/article/details/145212415</link><guid>https://blog.youkuaiyun.com/LIEBESFREUD/article/details/145212415</guid><author>LIEBESFREUD</author><pubDate>Fri, 17 Jan 2025 23:19:56 +0800</pubDate><description><![CDATA[还算简单，与组合不同的地方在于可以重复使用。意思就是for循环中递归时start不后移。现在想明白华为笔试的题为什么通过率低了，就是因为没有优化。自己写了一版AC了，但是效率很低；单层遍历才需要去重。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营第二十二天 | 77. 组合、216.组合总和III、17.电话号码的字母组合]]></title><link>https://blog.youkuaiyun.com/LIEBESFREUD/article/details/145161211</link><guid>https://blog.youkuaiyun.com/LIEBESFREUD/article/details/145161211</guid><author>LIEBESFREUD</author><pubDate>Wed, 15 Jan 2025 17:01:45 +0800</pubDate><description><![CDATA[想起来11月被华为机试干掉的那一天...子集划分题考场上已经想到回溯+DP但是回溯写不起来饮恨当场...这次刷完去把几题回溯+DP的题过一遍...加深印象!!!]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营第二十一天 | 669. 修剪二叉搜索树、 108.将有序数组转换为二叉搜索树 、538.把二叉搜索树转换为累加树]]></title><link>https://blog.youkuaiyun.com/LIEBESFREUD/article/details/145133666</link><guid>https://blog.youkuaiyun.com/LIEBESFREUD/article/details/145133666</guid><author>LIEBESFREUD</author><pubDate>Tue, 14 Jan 2025 11:42:36 +0800</pubDate><description><![CDATA[思路主要是先修剪左右子树，然后如果当前节点val小于low，按照搜索树的性质只能返回右子树，如果val大于high,按照搜索树的性质只能返回左子树。这里迭代实现感觉用三个队列有点不清晰...直接在队列里压入tuple即可模拟。右-中-左， 记录pre即可。自己写了一版AC了。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营第二十天 | 235. 二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点]]></title><link>https://blog.youkuaiyun.com/LIEBESFREUD/article/details/145118244</link><guid>https://blog.youkuaiyun.com/LIEBESFREUD/article/details/145118244</guid><author>LIEBESFREUD</author><pubDate>Mon, 13 Jan 2025 16:45:23 +0800</pubDate><description><![CDATA[如果要删的节点有两个儿子，交换当前节点和他的后继，然后递归。如果要删的节点最多只有1个儿子，直接用这个儿子代替。题解速度更快：把左子树直接放到后继的左子树上即可。使用二叉搜索树得性质。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营第十八天 | 530.二叉搜索树的最小绝对差、 501.二叉搜索树中的众数 、 236. 二叉树的最近公共祖先]]></title><link>https://blog.youkuaiyun.com/LIEBESFREUD/article/details/145069379</link><guid>https://blog.youkuaiyun.com/LIEBESFREUD/article/details/145069379</guid><author>LIEBESFREUD</author><pubDate>Sat, 11 Jan 2025 09:23:49 +0800</pubDate><description><![CDATA[这题主要就是如何把找到的结果传回来比较tricky。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营第十七天 | 654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树]]></title><link>https://blog.youkuaiyun.com/LIEBESFREUD/article/details/145047032</link><guid>https://blog.youkuaiyun.com/LIEBESFREUD/article/details/145047032</guid><author>LIEBESFREUD</author><pubDate>Fri, 10 Jan 2025 09:16:28 +0800</pubDate><description><![CDATA[也很容易，终止条件是两者至少有一个为None，不为None的一边就dominant只有他的部分。否则就将该节点求和，并且递归调用merge函数为新的root赋左右子树。查左边最大的和右边最小的。或者使用中序是有序的。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营第十六天 | 513.找树左下角的值、112. 路径总和、106.从中序与后序遍历序列构造二叉树]]></title><link>https://blog.youkuaiyun.com/LIEBESFREUD/article/details/145036949</link><guid>https://blog.youkuaiyun.com/LIEBESFREUD/article/details/145036949</guid><author>LIEBESFREUD</author><pubDate>Thu, 09 Jan 2025 21:20:31 +0800</pubDate><description><![CDATA[找左下角就是找某个子树的左下角，这个左下角元素肯定是深度最大的左叶子。其实感觉自己这个比题解里面回溯好理解一些...把回溯方法也写一下。细想了一下之前好多题我的闭包传递方法好像也是回溯？在中序中找到根节点，左边就是左子树右边就是右子树。广搜先right后left, 最后就是左下角了。后序的末尾是当前需要构建的二叉树的根节点；直接使用回溯模板即可。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营第十五天 | 110.平衡二叉树、 257. 二叉树的所有路径、 404.左叶子之和、222.完全二叉树的节点个数]]></title><link>https://blog.youkuaiyun.com/LIEBESFREUD/article/details/145016147</link><guid>https://blog.youkuaiyun.com/LIEBESFREUD/article/details/145016147</guid><author>LIEBESFREUD</author><pubDate>Wed, 08 Jan 2025 20:51:07 +0800</pubDate><description><![CDATA[看一下题解，向左边探查递归返回时查看是否是父节点的左叶子，如果是的话就找到一个左叶子，记录值。向右探查时也会一起赋值，思路相对巧妙。但是题目里面说了是个完全二叉树，完全二叉树可以节省时间，因为完全二叉树一个节点的左子树和右子树至少有一个是完全二叉树。自己写了一版，辅助函数同时算高度和是否是平衡的。辅助函数只算高度，用-1表示不平衡了。回溯，遇到叶子节点就收集结果。闭包传递，稀里糊涂也写对了。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营第十四天 | 226.翻转二叉树、101. 对称二叉树、104.二叉树的最大深度、111.二叉树的最小深度]]></title><link>https://blog.youkuaiyun.com/LIEBESFREUD/article/details/144993837</link><guid>https://blog.youkuaiyun.com/LIEBESFREUD/article/details/144993837</guid><author>LIEBESFREUD</author><pubDate>Tue, 07 Jan 2025 23:46:51 +0800</pubDate><description><![CDATA[就是个深搜，先翻转左右子树，再递归调用，让自己的子树也翻转。最终所有的子树翻转一次，总体就翻转过来了。感觉上差不多，这里对非叶子节点做了判断，在不是叶子节点的地方不去做比较。递归很容易，因为根节点不用管，所以构造一个辅助函数即可。递归也不难~当前层的最大深度=左子树右子树的最大深度+1。这题因为只有到叶子节点才算一个路径，这里用闭包传递。迭代：从上往下遇到第一个叶子节点就是最小深度。迭代写法：也就是个前序遍历。这题一下想到广搜..]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营第十三天 | 二叉树遍历]]></title><link>https://blog.youkuaiyun.com/LIEBESFREUD/article/details/144988160</link><guid>https://blog.youkuaiyun.com/LIEBESFREUD/article/details/144988160</guid><author>LIEBESFREUD</author><pubDate>Tue, 07 Jan 2025 20:58:54 +0800</pubDate><description><![CDATA[每个循环开始时，一直找左子树的最左边的空，这时候回头查看栈顶，栈顶元素就是中。随后把cur指向中的右，如果右是个空，则直接取栈顶，也就是模拟返回，否则在右子树中继续找左。中序麻烦就麻烦在发现一个节点的时候并不记录他的值，而是从左边返回这个节点的时候再记录值。实际上访问顺序还是一样的都是深搜，代码中需要显式表示“从左边返回”即可。首先root进栈，每次循环弹出栈顶元素，记录值并将左右子树进栈，这里要注意先压右子树再压左子树。直接反转有点trivial，这里仿照中序硬写一版。标记法，分为空标记和布尔标记。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营第十一天 | 150. 逆波兰表达式求值、239. 滑动窗口最大值 、 347.前 K 个高频元素]]></title><link>https://blog.youkuaiyun.com/LIEBESFREUD/article/details/144930702</link><guid>https://blog.youkuaiyun.com/LIEBESFREUD/article/details/144930702</guid><author>LIEBESFREUD</author><pubDate>Sat, 04 Jan 2025 17:08:17 +0800</pubDate><description><![CDATA[在实现中遇到的困难是，5500课程里给了每一个窗口元素一个时间戳，记录本元素已经入队多久，如果时间戳大于窗口长度，则他必须离队。实际上这种实现在本题中会超时，因此这里花思考改进，streaming的时候因为数据流很大，针对的是相对小的窗口，因此如果窗口过大会超时；这里因为可以访问原数组，因此如果单调队列中存index非entry，在查入队时间时可以直接使用下标相减检查这个元素是否还在窗口。这题滑动窗口求最值，维护单调队列即可。实际上，看了题解可以不用先全都heapify, 维护一个固定大小的小顶堆即可。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营第十天 | 232. 用栈实现队列、225. 用队列实现栈、20. 有效的括号、1047. 删除字符串中的所有相邻重复项]]></title><link>https://blog.youkuaiyun.com/LIEBESFREUD/article/details/144912711</link><guid>https://blog.youkuaiyun.com/LIEBESFREUD/article/details/144912711</guid><author>LIEBESFREUD</author><pubDate>Fri, 03 Jan 2025 16:51:24 +0800</pubDate><description><![CDATA[每次循环一个字符，查看栈顶，如果栈非空且栈顶与当前遍历字符相同，弹出栈顶且不加入新元素；双栈实现队列，一个管进一个管出即可。但是照着测试数据才能考虑完全…经典栈应用，判断括号闭合。一个队列就可以实现栈。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营第八天 | 344.反转字符串、541. 反转字符串II、卡码网：54.替换数字]]></title><link>https://blog.youkuaiyun.com/LIEBESFREUD/article/details/144897098</link><guid>https://blog.youkuaiyun.com/LIEBESFREUD/article/details/144897098</guid><author>LIEBESFREUD</author><pubDate>Thu, 02 Jan 2025 23:23:48 +0800</pubDate><description><![CDATA[这题Python也没法原地，再用切片吧。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营第九天 | 151.翻转字符串里的单词、卡码网：55.右旋转字符串、28. 实现 strStr()、459.重复的子字符串]]></title><link>https://blog.youkuaiyun.com/LIEBESFREUD/article/details/144893717</link><guid>https://blog.youkuaiyun.com/LIEBESFREUD/article/details/144893717</guid><author>LIEBESFREUD</author><pubDate>Thu, 02 Jan 2025 23:13:45 +0800</pubDate><description><![CDATA[KMP最关键的在于LPS，LPS记录了模式串当前位置的Longest Prefix Suffix，因此，如果在主字符串的某位置未能匹配，则将模式串回退到LPS位置重新匹配。CSIT5500的字符串章节已经学过KMP和后缀数组，这题模式串就是needle，先计算needle的next数组，然后匹配时找到一次匹配就退出。，于是代码也就简单了，先看是否可能有周期，然后如果有可能有周期，求出可能的周期，看能否被字符串长度整除即可。不需要匹配，直接把s当成模式串，判断模式串的周期性即可。这代码还真不容易写对…]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营第七天 | 454.四数相加II 、383. 赎金信、15. 三数之和、18. 四数之和]]></title><link>https://blog.youkuaiyun.com/LIEBESFREUD/article/details/144850042</link><guid>https://blog.youkuaiyun.com/LIEBESFREUD/article/details/144850042</guid><author>LIEBESFREUD</author><pubDate>Tue, 31 Dec 2024 16:42:53 +0800</pubDate><description><![CDATA[这样其实速度还可以，但是实际上时间复杂度和空间复杂度都有优化的空间。后面改进后分别记录了nums1、nums2的和以及nums3、nums4的和，然后Counter方法拿到了两两和字典，再使用乘法原理和加法原理计算方法总数。第一遍实现的时候超时了，将nums1和nums2的和求出来之后又遍历和数组去找nums3和nums4中符合要求的，这里遍历和数组后复杂度变成了。本题算是好做的，因为有4个相同大小的数组，且位置也可以取相同。可以将4数之和破开成两两的和。有了三数之和的经验，这题相当简单。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营第六天 | 242. 有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和]]></title><link>https://blog.youkuaiyun.com/LIEBESFREUD/article/details/144819177</link><guid>https://blog.youkuaiyun.com/LIEBESFREUD/article/details/144819177</guid><author>LIEBESFREUD</author><pubDate>Mon, 30 Dec 2024 12:26:26 +0800</pubDate><description><![CDATA[言归正传，建一个哈希表，key放数值，value放对应的索引。每次循环查target-num键是否在哈希表中，如果在报告结果。否则把当前num存入哈希表，值为对应的索引。建一个集合用于记录目前为止的各位平方和，如果等于1说明是快乐数，否则一旦发现重复了直接报告Flase.每次做这一题都需要打开评论查看一下"有人相爱，有人夜里开车看海，有人leetcode第一题都做不出来。这里再写一个双指针实现，为后续的三数之和、四数之和做准备。哈希表有最大长度26，直接使用数组做哈希。]]></description><category></category></item><item><title><![CDATA[代码随想录算法训练营第四天 | 24. 两两交换链表中的节点 、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交 、142.环形链表II]]></title><link>https://blog.youkuaiyun.com/LIEBESFREUD/article/details/144789961</link><guid>https://blog.youkuaiyun.com/LIEBESFREUD/article/details/144789961</guid><author>LIEBESFREUD</author><pubDate>Sat, 28 Dec 2024 16:39:29 +0800</pubDate><description><![CDATA[如果有环，计算入口，假设入口index=i，那么slow指针走了i步就到了入口，这时fast在2i处。假设fast已经在环内转了n圈，经过k个时间步，fast再次追上了slow， 因为他俩相对速度是1， 所以必定在一圈之内追上，假设从环口走了k步相遇，则相遇点距离环口k。这里要注意，让slow指针指向被删除的前一个才能正确删除节点，因此修改while循环条件，让指针在需要删除的节点前面就停下。快慢指针，快指针先走n步，随后快慢指针同时走到终点，slow指针即指向需要被删除的节点。]]></description><category></category></item></channel></rss>