小白学习算法
文章平均质量分 54
菥菥爱嘻嘻
让自己快乐快乐这才叫做意义
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
力扣面试150(69/150)
本文讨论了LeetCode 236题"二叉树的最近公共祖先"的解法。通过深度优先遍历递归查找两个目标节点p和q,当当前节点是p/q或null时返回该节点。若左右子树都找到目标则返回当前根节点作为祖先,否则返回非空的一侧。最初代码比较节点值而非节点对象导致返回null,修正后正确比较节点引用即可。该算法时间复杂度O(n),空间复杂度O(h),其中h为树高。关键点在于递归终止条件和左右子树结果的组合判断。原创 2025-09-01 11:12:02 · 259 阅读 · 0 评论 -
力扣面试150(68/100)
这篇文章介绍了计算完全二叉树节点数的高效算法。算法核心是利用完全二叉树的性质:通过比较左右子树高度快速判断是否为满二叉树。若高度相同,直接使用公式2^h-1计算节点数;否则递归计算左右子树节点数之和加1。这种方法避免了不必要的递归遍历,时间复杂度优化为O(log^2 N)。代码实现简洁,通过左右深度比较和递归调用,有效结合了数学公式和分治策略。原创 2025-08-31 11:01:13 · 284 阅读 · 0 评论 -
力扣面试150(67/150)
本文实现了一个二叉搜索树迭代器,采用中序遍历预计算策略。初始化时通过递归中序遍历将节点值存入数组,next()方法返回数组首元素并移除,hasNext()判断数组是否为空。这种方法保证了next()和hasNext()操作的高效性(O(1)时间复杂度),但初始化时需要O(n)时间进行完整遍历。空间复杂度为O(n)用于存储所有节点值。适用于需要频繁查询但树结构不变的情况。原创 2025-08-29 10:33:35 · 187 阅读 · 0 评论 -
力扣面试150(66/150)
本文介绍了一个计算二叉树根节点到所有叶节点路径数字之和的算法。采用深度优先搜索策略,在递归过程中维护从根到当前节点的路径数值(prevSum*10 + node.val)。遇到叶子节点时直接返回路径值,非叶子节点则递归处理左右子树并求和。算法时间复杂度为O(n),空间复杂度为O(h),其中n为节点数,h为树高。该解法通过递归高效地实现了路径数值的累加,适用于所有合法二叉树输入。原创 2025-08-28 08:31:41 · 251 阅读 · 0 评论 -
力扣面试150(65/150)
本文介绍了LeetCode 112题"路径总和"的解法。该题要求判断二叉树中是否存在根到叶子的路径,其节点值之和等于目标值。作者采用深度优先遍历的递归解法,通过减法实现路径和计算:每次访问节点时用目标值减去节点值,到达叶子节点时判断剩余值是否为零。关键点在于正确处理递归终止条件(叶子节点判断)和左右子树的或运算返回。该算法时间复杂度为O(n),空间复杂度为O(h),其中h为树高,能高效解决问题。原创 2025-08-27 10:40:14 · 176 阅读 · 0 评论 -
力扣面试150(64/150)
本文介绍了将二叉树原地展开为链表的算法。通过使用栈结构和前驱指针,代码实现了先序遍历的迭代版本:每次处理当前节点时,将前驱节点的右指针指向当前节点,左指针置空。关键点在于栈的压入顺序(先右后左)保证了正确的遍历顺序。该算法满足题目要求的原地修改和先序遍历顺序,时间复杂度O(n),空间复杂度O(n)。原创 2025-08-26 09:09:55 · 295 阅读 · 0 评论 -
力扣面试150(63/150)
本文介绍了一种使用BFS层次遍历方法连接二叉树节点next指针的解决方案。算法通过队列逐层处理节点,将每层节点的next指针指向右侧相邻节点。代码实现中,使用数组模拟队列,先处理当前层节点并连接next指针,同时将下一层节点入队。该方法时间复杂度为O(n),空间复杂度为O(n),能够正确处理任意形状的二叉树,确保每层节点的next指针正确指向右侧节点或NULL。该解法思路清晰,适用于处理不完美二叉树的情况。原创 2025-08-22 16:15:00 · 205 阅读 · 0 评论 -
力扣面试150(62/150)
这道题目要求根据二叉树的中序和后序遍历结果重建二叉树。关键在于利用后序遍历的最后一个元素确定根节点,然后在中序遍历中找到该节点位置以划分左右子树。通过递归处理左右子树对应的中序和后序子数组,最终构建完整二叉树。代码修正了之前的分割错误,确保递归正确终止,时间复杂度为O(n),空间复杂度为O(n)。该解法体现了分治思想在树结构重建中的典型应用。原创 2025-08-21 12:09:20 · 276 阅读 · 0 评论 -
力扣面试150(61/100)
本文介绍了根据前序和中序遍历序列重建二叉树的递归解法。关键思路是利用前序遍历确定根节点,通过中序遍历划分左右子树。算法步骤如下:1)前序首元素为根节点;2)在中序中找到根节点位置,划分左右子树;3)递归处理左右子树。该方法时间复杂度为O(n),空间复杂度O(n),体现了分治思想,通过不断划分子问题最终构建完整二叉树。需要特别注意数组切分的边界条件。原创 2025-08-20 16:27:00 · 278 阅读 · 0 评论 -
力扣面试150(60/150)
本文介绍了一种使用BFS层次遍历判断二叉树是否对称的算法。算法通过队列同时比较左右子树,将对应节点成对入队:每次取出两个节点,若都为空则继续;若一个为空或值不等则返回false;否则将左右子节点按相反顺序入队(左左与右右、左右与右左)。最终所有节点都满足对称条件时返回true。该方法时间复杂度为O(n),空间复杂度为O(n),能有效检测二叉树的对称性。原创 2025-08-19 15:11:07 · 195 阅读 · 0 评论 -
力扣面试150(58/150)
本文介绍了一种翻转二叉树的递归解法。通过后序遍历的方式,先递归处理左右子树,再交换当前节点的左右孩子。算法时间复杂度为O(n),空间复杂度为O(h),其中h为树的高度。代码简洁明了,适用于任意结构的二叉树翻转。原创 2025-08-17 09:20:14 · 519 阅读 · 0 评论 -
力扣面试150(57/100)
本文通过递归方法判断两棵二叉树是否相同。算法核心是:若两节点均为空则返回true;若仅一个为空则返回false;若节点值不同则返回false;否则递归比较左右子树。只有当所有对应节点结构和值都相同时才返回true。该方法简洁高效,时间复杂度O(n),空间复杂度O(h),其中n为节点数,h为树高。代码实现清晰体现了递归思想,通过逐层比较确保两棵树完全一致。原创 2025-08-16 10:22:33 · 247 阅读 · 0 评论 -
力扣面试150(56/150)
本文介绍了如何用递归方法求解二叉树的最大深度。对于给定的二叉树,当节点为空时返回深度0;否则递归计算左右子树的最大深度,取较大值加1作为当前节点的深度。这种方法通过深度优先遍历,从叶子节点开始逐层向上累加,最终得到整棵树的最大深度。算法时间复杂度为O(n),空间复杂度为O(h),其中h为树的高度。这是二叉树深度计算的经典递归解法。原创 2025-08-14 10:35:04 · 190 阅读 · 0 评论 -
力扣面试150(55/150)
本文实现了一个LRU缓存机制,使用Map数据结构存储键值对并维护访问顺序。核心思路是:get操作时若key存在则先删除再重新插入以更新访问顺序;put操作时若key已存在则更新顺序,若不存在且缓存已满则删除Map中最久未使用的项(第一个键)。通过Map的有序特性实现了O(1)时间复杂度的get和put操作,确保缓存容量不超过设定值时自动淘汰最久未使用的数据。这种实现方式简洁高效地满足了LRU缓存的基本要求。原创 2025-08-13 09:19:42 · 415 阅读 · 0 评论 -
力扣面试150(54/150)
本文解决了LeetCode 86题"分隔链表"问题。算法通过维护两个子链表(minHead和maxHead)来分别存储小于x和大于等于x的节点。遍历原链表时,根据节点值将其添加到对应子链表末尾,保持原始相对顺序。最后合并两个子链表,若无小于x的节点则直接返回maxHead。该方法时间复杂度O(n),空间复杂度O(1),关键点在于正确处理两个子链表的头指针和尾指针更新,以及处理各种边界情况如空链表或全大/全小链表。代码中特别处理了链表尾部的null终止,确保结果正确。原创 2025-08-12 09:57:28 · 383 阅读 · 0 评论 -
力扣面试150(53/150)
摘要: 本文介绍了一个高效旋转链表的算法解决方案。算法首先计算链表长度,通过取模运算确定实际旋转步数。关键步骤包括:找到新头节点的前驱节点,断开链表并重新连接形成旋转后的结构。该方法时间复杂度O(n),空间复杂度O(1),通过"先成环再断开"的思路优雅地解决了链表旋转问题。代码实现简洁,正确处理了边界条件,如空链表或零旋转的情况。原创 2025-08-11 11:53:40 · 310 阅读 · 0 评论 -
力扣面试150(52/150)
本文探讨了如何删除已排序链表中所有重复数字的节点。通过引入虚拟头节点dummy,使用carry指针遍历链表。当发现重复节点时,记录重复值并跳过所有该值节点;否则正常后移指针。关键点在于通过dummy.next始终指向处理后的链表头,确保原始头节点被删除时仍能正确返回。该方法有效解决了删除全部重复元素的问题,时间复杂度为O(n)。原创 2025-08-10 10:26:23 · 394 阅读 · 0 评论 -
力扣面试150(51/100)
摘要: 本文介绍了删除链表倒数第N个节点的解法。通过引入虚拟头节点统一处理所有情况,避免了单独判断头节点的删除。算法分为两步:1) 遍历链表计算长度;2) 二次遍历定位到目标节点的前驱节点进行删除。关键点在于使用虚拟头节点简化逻辑,使删除头节点、中间节点和尾节点的操作一致,提升代码简洁性。时间复杂度O(L)(L为链表长度),空间复杂度O(1)。原创 2025-08-09 12:18:08 · 196 阅读 · 0 评论 -
力扣面试150(50/150)
这篇文章介绍了如何实现链表部分反转(LeetCode 92题)。主要思路是:1)创建虚拟头节点处理边界情况;2)定位要反转区间的前驱节点、头节点和尾节点;3)切断子链表并进行反转;4)将反转后的子链表重新拼接回原链表。关键步骤包括:精确指针定位、独立反转子链表、前后节点重新连接。该方法通过虚拟头节点统一处理各种情况,确保逻辑清晰健壮,是一个经典的链表操作范例。最终返回虚拟头节点的next即得到完整结果。原创 2025-08-08 11:10:31 · 312 阅读 · 0 评论 -
力扣面试150(49/150)
摘要:本文讨论了如何实现带有随机指针的链表深拷贝问题。通过使用Map存储新旧节点映射关系,先创建新节点复制原节点值,再遍历原链表为新节点设置正确的next和random指针(需处理null情况)。该方法确保了新链表与原链表结构相同但完全独立,时间复杂度为O(n),空间复杂度为O(n)。关键点在于通过映射关系正确建立新节点间的连接,而非直接复制原指针。原创 2025-08-07 11:37:04 · 333 阅读 · 0 评论 -
力扣面试150(48/150)
本文介绍了一种合并两个有序链表的方法。通过创建一个哑节点作为新链表的起始点,使用指针遍历两个链表,比较节点值大小,将较小值节点依次连接到新链表。当某个链表遍历完后,直接将剩余节点连接到新链表末尾。关键点在于:1)使用哑节点简化操作;2)正确移动链表指针;3)处理剩余节点时也要移动新链表的指针。该方法高效地实现了有序链表的合并,时间复杂度为O(n+m),空间复杂度为O(1)。原创 2025-08-06 12:23:25 · 194 阅读 · 0 评论 -
力扣面试150(47/100)
该题目要求实现两个逆序存储数字的链表相加。解题思路是新建链表模拟加法运算,逐位处理两个链表的节点值及进位。关键点在于:使用临时链表存储结果,处理不同长度链表的情况,以及最后的进位处理。算法从最低位开始相加,计算当前位和进位,将结果存入新链表。当遍历完较长链表后,若仍有进位则需额外添加节点。最终返回的链表即为两数之和的逆序表示。时间复杂度O(max(m,n)),空间复杂度O(max(m,n))。原创 2025-08-05 14:16:02 · 301 阅读 · 0 评论 -
力扣面试150(46/150)
摘要:本文介绍了使用快慢指针法检测链表是否有环。在JavaScript中通过对象模拟链表结构,定义快慢两个指针,快指针每次走两步,慢指针走一步。如果存在环,快指针最终会追上慢指针;若无环则快指针会到达链表末尾。该方法时间复杂度O(n),空间复杂度O(1),是一种高效的环检测算法。原创 2025-08-01 12:15:19 · 207 阅读 · 0 评论 -
力扣面试150(45/150)
这段代码实现了逆波兰表达式求值功能。采用栈结构处理,遇到数字入栈,遇到运算符则弹出栈顶两个数字进行相应运算,注意减法和除法的顺序(后弹出数操作前弹出数),除法结果使用Math.trunc取整。运算结果重新入栈,最终栈中剩余的唯一数字即为表达式结果。该解法有效利用了栈的先进后出特性,正确实现了逆波兰表达式的计算逻辑。原创 2025-07-31 14:15:25 · 181 阅读 · 0 评论 -
力扣面试150(44/150)
本文实现了一个能在O(1)时间内获取最小值的栈结构。通过维护两个栈:主栈存储元素,辅助栈存储每个状态下的最小值。每次push操作时,辅助栈会存入当前元素与栈顶最小值中的较小者;pop操作同步移除两个栈的栈顶元素。这样,辅助栈顶始终保存当前栈的最小值,使得getMin操作可直接返回。该方法保证了所有栈操作的时间复杂度均为常数级,空间复杂度为O(n)。关键点在于辅助栈与主栈的同步维护,确保最小值的动态更新。原创 2025-07-30 13:50:22 · 348 阅读 · 0 评论 -
力扣面试150(43/150)
该题目要求将Unix风格的绝对路径简化为规范路径。解题思路是分割路径字符串,用栈结构处理目录操作:遇到空或'.'跳过,遇到'..'弹出栈顶目录(若栈非空),其他有效目录压入栈。关键点包括处理连续斜杠、目录分隔符和边界条件(如根目录回退)。最终通过栈构建规范路径,确保格式正确。算法时间复杂度O(n),空间复杂度O(n),能有效处理各种路径情况。原创 2025-07-29 13:28:22 · 380 阅读 · 0 评论 -
力扣面试150(42/150)
本文介绍了使用栈结构验证括号字符串有效性的算法。通过维护一个栈来处理括号匹配问题,遇到左括号压栈,遇到右括号则检查栈顶是否匹配。算法首先排除长度为奇数的情况,然后遍历字符串:左括号入栈,右括号则与栈顶匹配,不匹配或栈空即返回false。最终栈为空则字符串有效。时间复杂度O(n),空间复杂度O(n),是一种高效解决括号匹配问题的典型方法。原创 2025-07-28 10:29:12 · 300 阅读 · 0 评论 -
力扣面试150(41/150)
本文介绍了一个合并重叠区间的算法。首先将区间按起始点排序,然后逐个处理:如果当前区间与前一个合并后的区间重叠,则更新合并区间的结束点为较大值;否则将当前区间加入结果数组。算法通过一次遍历即可完成所有区间的合并,时间复杂度为O(nlogn)(主要来自排序),空间复杂度为O(n)。该方法简洁高效地解决了区间合并问题。原创 2025-07-25 09:57:26 · 190 阅读 · 0 评论 -
力扣面试150(40/150)
摘要:该算法用于将有序无重复整数数组转换为最小区间列表。初始化start和end为首元素,遍历数组时若遇到连续数字则更新end,否则将当前区间加入结果数组(格式为"a->b"或"a")。关键点在于处理区间连续性和输出格式,使用模板字符串简化了格式化过程。时间复杂度O(n),空间复杂度O(1)。作者通过分析区间连续性特征,采用双指针法有效解决问题。原创 2025-07-24 09:48:16 · 214 阅读 · 0 评论 -
力扣面试150(39/150)
文章摘要: 219题通过哈希表存储元素索引,在遍历时检查是否存在满足条件的重复元素(索引差≤k),时间复杂度O(n)。 128题利用哈希表和排序查找最长连续递减序列,虽然题目要求O(n)但采用O(nlogn)排序解法,通过统计连续元素数量得出结果。 两题均展示了哈希表在高效查找和存储方面的优势,分别用于解决重复元素检测和连续序列问题,体现了不同场景下哈希表的具体应用。原创 2025-07-23 14:39:51 · 300 阅读 · 0 评论 -
力扣面试150(37/150)
摘要:文章记录了LeetCode两道题目的解题思路和代码实现。第一题"两数之和"通过哈希表存储数字及其索引,遍历数组查找满足条件的索引对。第二题"快乐数"通过计算数字各位平方和,并用哈希表检测循环来判断是否为快乐数。两题均使用哈希表优化查找效率,第一题时间复杂度O(n),第二题通过循环检测避免无限循环。代码展示了JavaScript中Map的基本操作和算法应用。原创 2025-07-22 13:47:15 · 355 阅读 · 0 评论 -
力扣面试150(35/150)
本文提出了一种将字母异位词分组的算法。通过对每个字符串按字母排序生成唯一键,利用哈希表记录键与分组位置的映射关系,将相同字母组成的字符串存储在对应数组位置。算法时间复杂度为O(nklogk),其中n是字符串数量,k是字符串最大长度。实现简单高效,能正确处理所有字母异位词分组情况。原创 2025-07-21 15:00:54 · 195 阅读 · 0 评论 -
力扣面试150(34/150)
本文通过哈希表统计字符频率的方法判断两个字符串是否为字母异位词。首先遍历字符串s,用Map记录每个字符及其出现次数;然后遍历字符串t,逐个减少Map中对应字符的计数,若字符不存在或计数减至0时删除键。最终检查Map是否为空,为空则说明是字母异位词。该方法时间复杂度为O(n),空间复杂度为O(n),能有效解决字符频率匹配问题。原创 2025-07-20 16:46:12 · 228 阅读 · 0 评论 -
力扣面试150(33/150)
摘要: 题目要求判断字符串s中的单词是否与给定模式pattern完全匹配。解决思路是建立字符与单词的双向映射关系。首先将s拆分为单词数组,检查长度是否与pattern一致。然后分别建立pattern→s和s→pattern两个映射表,在遍历过程中验证对应关系是否一致。若所有字符与单词都能形成严格的双向一一映射,则返回true,否则返回false。该方法通过两次遍历确保模式匹配的准确性。原创 2025-07-18 19:56:00 · 225 阅读 · 0 评论 -
力扣面试150(32/150)
用两个哈希表分别记录 s→t 和 t→s 的映射,遍历时检查双向映射是否一致,不一致就返回 false,全部通过则返回 true。原创 2025-07-17 17:11:23 · 267 阅读 · 0 评论 -
力扣面试150(31/150)
摘要 题目要求判断字符串ransomNote是否能由magazine中的字符组成(每个字符只能用一次)。解决方案是使用哈希表统计magazine中各字符出现次数,然后遍历ransomNote检查字符是否足够。若ransomNote所有字符都能在magazine中找到足够数量,则返回true,否则返回false。这是一道典型的哈希表应用问题,考察对Map等基本数据结构的操作能力。时间复杂度O(m+n),其中m和n分别是两个字符串的长度。原创 2025-07-16 20:17:46 · 296 阅读 · 0 评论 -
力扣算法150(30/150)
摘要:本文通过遍历数独的行、列和3x3子网格,使用Set数据结构检查是否存在重复数字来验证数独的有效性。代码分三部分:检查每行数字是否唯一,检查每列数字是否唯一,以及检查9个子网格内数字是否唯一。遇到重复数字立即返回false,全部检查通过则返回true。该方法确保数字1-9在行、列和子网格中仅出现一次,有效验证数独规则。原创 2025-07-13 14:45:09 · 333 阅读 · 0 评论 -
力扣面试150(27/150)
利用指针的移动来缩小搜索范围或动态更新比较条件,从而优化时间复杂度。无论是回文串判断、子序列匹配,还是最大面积计算,都体现了指针在遍历和比较中的灵活运用。原创 2025-07-10 12:26:43 · 609 阅读 · 0 评论 -
力扣面试150(23/100)
Z 字形变换算法通过控制方向标志和行号的变化,将字符串按 Z 字形排列。找出字符串中第一个匹配项的下标算法通过逐个字符比较,找到子串的第一个匹配位置。这两个算法都展示了如何通过简单的逻辑和标志控制来解决问题,关键在于理解问题的本质和合理控制算法的流程。原创 2025-07-09 13:30:34 · 283 阅读 · 0 评论 -
力扣面试150(21/150)
两道题目都展示了字符串处理的基本技巧:分割、遍历、比较和重组。重点在于正确处理边界条件和空字符串情况。原创 2025-07-08 21:17:04 · 374 阅读 · 0 评论
分享