- 博客(143)
- 收藏
- 关注
原创 118. 杨辉三角
本文介绍了一个生成杨辉三角前numRows行的算法。杨辉三角的特点是每个数等于其左上和右上两数之和。算法通过双重循环实现:外层循环控制行数,内层循环生成每行的数字。对于每行的首尾元素设为1,中间元素通过上一行对应位置的和计算得出。时间复杂度为O(n²),空间复杂度为O(n²),适用于numRows≤30的情况。示例展示了输入5和1时的正确输出结果。
2026-01-05 09:31:28
127
原创 763. 划分字母区间
摘要:本文提出一种字符串划分算法,要求将字符串划分为尽可能多的片段,且每个字符仅出现在一个片段中。算法首先记录每个字符的首次和末次出现位置,然后合并重叠区间。最终返回各片段的长度列表。例如,"ababcbacadefegdehijhklij"被划分为长度为[9,7,8]的三个片段。该算法时间复杂度为O(n),空间复杂度为O(1),适用于小写字母组成的字符串。
2026-01-05 09:20:18
152
原创 121. 买卖股票的最佳时机
本文介绍了一个解决股票买卖时机问题的算法。给定每日股价数组,要求找到买入和卖出的最佳时机以获得最大利润。算法通过遍历数组,记录当前最低价并计算每日可能的利润来求解。时间复杂度为O(n),空间复杂度为O(1)。示例显示在价格1买入、6卖出可获得最大利润5,若价格持续下跌则利润为0。该方案高效解决了单次买卖股票的最大收益问题。
2026-01-04 16:37:56
102
原创 215. 数组中的第K个最大元素
摘要:本文介绍如何在数组中找到第K个最大元素的问题。题目要求设计时间复杂度为O(n)的算法。示例显示输入数组[3,2,1,5,6,4]和k=2时,输出为5。给出的解法使用最小堆(优先队列)维护前k大元素,遍历数组时将元素入堆,当堆大小超过k时弹出最小元素。最终堆顶即为第K大元素。该方法空间复杂度为O(k),满足题目要求。
2025-12-30 11:12:24
342
原创 84. 柱状图中最大的矩形
摘要:本文介绍了一种使用单调栈算法解决柱状图最大矩形面积问题的方法。给定n个非负整数表示柱状图高度,算法通过维护一个单调递增栈,分别计算每个柱子左右两侧第一个比它矮的柱子位置,从而确定以当前柱子为高的最大矩形宽度。时间复杂度为O(n),空间复杂度为O(n)。示例输入[2,1,5,6,2,3]的最大面积为10,对应红色区域。该解法高效处理了105量级的数据规模。
2025-12-30 10:06:46
138
原创 739. 每日温度
题目要求根据每日温度数组,计算每天需要等待多少天后温度会升高。使用单调栈从后往前遍历,栈中保存温度和索引。对于当前温度,弹出栈顶比它小的元素,直到找到第一个更大的温度,计算天数差;若栈为空则记为0。时间复杂度O(n),空间复杂度O(n)。示例:[73,74,75,71,69,72,76,73]输出[1,1,4,2,1,1,0,0]。
2025-12-29 10:04:42
243
原创 394. 字符串解码
该问题要求解码形如k[encoded_string]的编码字符串,其中k表示重复次数。解决方案采用递归方法:遍历字符串时,遇到字母直接加入结果,遇到数字则递归处理括号内的子串,并将结果重复k次。具体实现中,find函数处理数字和括号内的内容,decodeString函数作为主函数处理整个字符串。示例表明该方法能正确处理嵌套编码(如3[a2[c]]→"accaccacc")和连续编码(如2[abc]3[cd]ef→"abcabccdcdcdef")。时间复杂度为O(n)
2025-12-26 17:09:39
270
原创 155. 最小栈
本文实现了一个支持常数时间获取最小元素的栈结构。通过维护两个栈:主栈存储元素,辅助栈同步存储当前最小值。push操作时,辅助栈压入新元素与栈顶最小值中的较小值;pop操作同步弹出两个栈顶元素。这样,getMin只需返回辅助栈顶元素即可。示例展示了该结构在push(-2,0,-3)后getMin返回-3,pop后top返回0,getMin返回-2的功能。算法各操作时间复杂度均为O(1),满足题目要求。
2025-12-02 10:57:38
246
原创 153. 寻找旋转排序数组中的最小值
摘要:该问题要求在旋转后的升序数组中寻找最小元素。给定一个元素互不相同且经过1到n次旋转的升序数组,需设计O(logn)算法。解决方案采用二分查找:若数组未旋转(首元素≤尾元素),直接返回首元素;否则递归比较中间值与右边界值,缩小搜索范围直至找到最小值。示例验证了算法的正确性,如输入[3,4,5,1,2]输出1,[4,5,6,7,0,1,2]输出0等。
2025-12-02 10:09:37
315
原创 74. 搜索二维矩阵
摘要:本文介绍了在满足特定条件的二维矩阵中搜索目标值的问题。矩阵每行按非严格递增排列,且每行首元素大于前一行末元素。解决方案利用二分查找算法,将二维矩阵视为一维数组处理,通过计算中间位置的行列索引进行比较。时间复杂度为O(log(mn)),空间复杂度为O(1)。示例代码展示了递归实现的二分查找过程,能高效判断目标值是否存在。
2025-12-02 09:47:38
365
原创 51. N 皇后
摘要:N皇后问题要求在n×n棋盘上放置n个互不攻击的皇后(皇后可以攻击同行、同列或同斜线的棋子)。本文给出一个回溯算法的C++实现,使用布尔数组标记行、列及两条对角线的占用状态。通过深度优先搜索尝试所有可能的放置方案,当找到合法解时保存结果。示例显示n=4时有2种解法,n=1时有1种解法。该算法适用于1≤n≤9的情况,时间复杂度为O(n!)。
2025-12-01 21:42:43
309
原创 131. 分割回文串
摘要:本文提出了一种解决字符串分割回文串问题的算法。给定字符串s,要求将其分割为若干子串,每个子串都必须是回文串。算法通过位运算枚举所有可能的分割方式,利用辅助函数isH()检测回文性,最终收集所有有效的分割方案。时间复杂度为O(n·2^n),其中n为字符串长度。示例输入"aab"可输出[["a","a","b"], ["aa","b"]]两种有效分割方案。该解法适用于长度不超过16的小写
2025-11-28 16:25:21
217
原创 79. 单词搜索
本文介绍了解决单词搜索问题的深度优先搜索(DFS)算法。给定一个m×n的字符网格和一个目标单词,判断单词是否存在于网格中。单词需要通过相邻单元格(上下左右)的字母顺序构成,且不能重复使用单元格。算法首先找到所有与单词首字母匹配的起始点,然后通过DFS递归搜索相邻单元格,使用标记数组避免重复访问。若找到完整匹配则返回true,否则返回false。时间复杂度为O(mn×3^L),其中L为单词长度。该方法通过剪枝优化了搜索效率,适用于较大的网格。
2025-11-28 11:30:02
342
原创 78. 子集
本文介绍了一种使用二进制枚举法生成数组所有子集(幂集)的算法。给定一个元素互不相同的整数数组,该方法通过将每个子集对应为一个二进制数,其中每一位表示是否包含对应位置的数组元素。算法遍历所有可能的二进制组合(从0到2^n-1),将每个二进制数转换为对应的子集。时间复杂度为O(n*2^n),空间复杂度为O(1)(不考虑输出结果)。示例表明该方法能正确生成包含空集在内的所有子集,适用于长度不超过10的数组。
2025-11-27 16:34:05
186
原创 208. 实现 Trie (前缀树)
本文介绍了Trie(前缀树)的实现方法。Trie是一种用于高效存储和检索字符串的树形数据结构,支持插入、搜索和前缀匹配操作。实现包含三个核心方法:insert()用于插入字符串,search()判断字符串是否存在,startsWith()检查是否存在以给定前缀开头的字符串。代码使用26个子节点的数组表示字母表,并通过哈希集合辅助快速查找。示例展示了插入"apple"后,可以成功搜索该词,并验证"app"前缀的存在性。该实现适用于自动补全、拼写检查等场景,时间复杂度与字
2025-11-27 15:04:57
363
原创 207. 课程表
摘要:本文探讨了课程表问题,判断在给定先修课程要求下是否能完成所有课程学习。通过构建有向图并计算入度,使用拓扑排序算法检测图中是否存在环。若存在环则无法完成(返回false),否则可以完成(返回true)。示例1输入[[1,0]]输出true,示例2输入[[1,0],[0,1]]因存在循环依赖输出false。算法时间复杂度主要取决于课程数和先修条件数量。
2025-11-27 10:41:07
382
原创 994. 腐烂的橘子
该问题要求计算腐烂橘子感染所有新鲜橘子的最短时间。使用BFS方法,首先统计初始腐烂橘子和新鲜橘子数量。每分钟处理当前所有腐烂橘子,将其四周新鲜橘子腐烂并更新队列。若处理后新鲜橘子数量未减少,则返回-1表示无法全部腐烂;否则继续迭代直到没有新鲜橘子。时间复杂度为O(mn),空间复杂度为O(mn)。示例1输出4分钟,示例2因有橘子无法被感染返回-1,示例3初始无新鲜橘子直接返回0。
2025-11-26 21:05:12
115
原创 200. 岛屿数量
本文介绍了一个计算二维网格中岛屿数量的算法。给定由'1'(陆地)和'0'(水)组成的网格,岛屿被定义为水平或垂直相邻的陆地组成的区域。算法采用深度优先搜索(DFS)方法,遍历网格时遇到'1'就将其标记为'0'并递归探索相邻区域,以此统计岛屿数量。示例显示,对于特定输入网格,算法能正确输出岛屿数(如1个或3个)。时间复杂度为O(mn),其中m和n分别为网格的行数和列数。该解法适用于最大300×300规模的网格。
2025-11-26 20:19:11
273
原创 124. 二叉树中的最大路径和
本文探讨了二叉树中最大路径和问题。路径定义为节点序列,相邻节点有边相连,节点不重复出现。路径和是节点值总和,不一定经过根节点。通过后序遍历计算每个节点的最大贡献值,同时更新全局最大路径和。示例1中路径2→1→3的和为6,示例2中路径15→20→7的和为42。算法时间复杂度O(n),空间复杂度O(h),h为树高。该解法适用于节点值范围[-1000,1000],节点数达3×10⁴的情况。
2025-11-26 19:55:53
223
原创 437. 路径总和 III
摘要: 题目要求统计二叉树中和为给定值targetSum的路径数量,路径可从任意节点开始向下延伸。解法采用双重递归:外层遍历每个节点作为起点,内层从当前节点出发累加路径和,匹配时计数。时间复杂度O(n²),空间复杂度O(n)。示例输入root=[10,5,-3,3,2,null,11,3,-2,null,1],targetSum=8时输出3,因存在3条和为8的路径。
2025-11-26 16:50:41
407
原创 114. 二叉树展开为链表
本文提出了一种将二叉树原地展开为链表的递归解法。算法通过后序遍历处理每个节点:1. 对于当前节点,递归处理其左右子树;2. 若存在左子树,将左子树的最右节点连接到右子树,然后将左子树移到右子树位置;3. 返回当前子树的最右节点。该方法满足O(1)空间复杂度要求,展开后的链表保持先序遍历顺序,所有左指针置空。时间复杂度为O(n),其中n为节点数。示例代码展示了该算法的C++实现。
2025-11-26 16:18:59
337
原创 105. 从前序与中序遍历序列构造二叉树
本文介绍如何根据二叉树的前序和中序遍历序列重构二叉树。前序遍历的首元素为根节点,在中序遍历中找到该元素可确定左右子树范围。通过递归方法,分别处理左右子树区间:左子树区间为前序序列的下一个元素到中序根节点左侧,右子树区间为前序序列的剩余部分到中序根节点右侧。使用哈希表存储中序元素位置以优化查找效率。示例展示了输入[3,9,20,15,7]和[9,3,15,20,7]时输出[3,9,20,null,null,15,7]的构建过程。算法时间复杂度为O(n),空间复杂度为O(n)。
2025-11-25 10:58:17
161
原创 199. 二叉树的右视图
摘要: 题目要求返回二叉树从右侧视角能看到的节点值序列。采用前序遍历方法,在遍历过程中记录每层最右边的节点值。通过维护当前最大深度和临时数组,在遍历时更新每层的节点值,最终输出前max_depth+1个元素作为结果。该方法时间复杂度为O(n),空间复杂度为O(h)(递归栈空间),适用于节点数≤100的二叉树。示例表明,对于不同结构的树,算法能正确输出右侧视图序列。
2025-11-25 09:33:41
412
原创 230. 二叉搜索树中第 K 小的元素
摘要:题目要求在二叉搜索树中查找第k小的元素。通过中序遍历(左-根-右)可以按升序访问节点,当访问到第k个节点时返回其值。示例1输入[3,1,4,null,2]和k=1时输出1,示例2输入[5,3,6,2,4,null,null,1]和k=3时输出3。解决方案使用递归中序遍历,时间复杂度O(n),空间复杂度O(n)。进阶问题建议在节点中维护子树大小以实现O(h)时间复杂度的查询。
2025-11-24 15:36:16
243
原创 98. 验证二叉搜索树
本文提出了一种验证二叉搜索树(BST)的递归算法。BST需满足:左子树所有节点值小于当前节点,右子树所有节点值大于当前节点,且左右子树也必须是BST。算法通过定义状态结构体state,记录子树是否为BST、最大值和最小值。递归处理左右子树,检查当前节点值是否符合BST条件,并更新状态。最终返回根节点的验证结果。该方法时间复杂度为O(n),空间复杂度为O(h),其中n为节点数,h为树高。
2025-11-24 14:21:26
472
原创 108. 将有序数组转换为二叉搜索树
摘要:题目要求将升序排列的整数数组转换为高度平衡的二叉搜索树。通过递归分治的方法,每次选择中间元素作为根节点,左子树由数组左半部分构建,右子树由右半部分构建。示例展示了不同数组的转换结果,说明可能存在多个正确答案。解决方案时间复杂度为O(n),空间复杂度为O(logn)(递归栈空间)。该算法确保了生成的二叉搜索树始终保持高度平衡。
2025-11-24 10:28:21
1088
原创 543. 二叉树的直径
本文介绍了计算二叉树直径的算法。二叉树的直径定义为树中任意两节点间最长路径的边数,该路径可能不经过根节点。通过深度优先搜索(DFS)递归遍历二叉树,在计算每个节点左右子树高度的同时,更新当前最长路径(左子树高度+右子树高度)。最终返回遍历过程中记录的最大直径值。该算法时间复杂度为O(n),空间复杂度为O(h),其中n为节点数,h为树的高度。文中给出了C++实现代码,核心是递归计算子树高度并维护全局最大直径。
2025-11-13 20:40:31
105
原创 101. 对称二叉树
本文探讨了如何判断二叉树是否对称。通过递归方法实现,算法首先检查根节点是否为空,然后递归比较左右子树:要求左子树的左节点等于右子树的右节点,且左子树的右节点等于右子树的左节点。时间复杂度为O(n),空间复杂度为O(h),其中h为树高。示例表明,对于对称树返回true,非对称则返回false。该方法简洁有效地解决了对称二叉树的判断问题。
2025-11-13 15:17:07
257
原创 226. 翻转二叉树
题目描述翻转二叉树的每个节点的左右子树,并返回翻转后的根节点。采用递归解法,从根节点开始,先递归翻转左右子树,然后交换当前节点的左右子树。时间复杂度O(n),空间复杂度O(h),其中h为树的高度。示例结果展示了翻转前后的二叉树结构变化。
2025-11-13 14:55:43
332
原创 104. 二叉树的最大深度
摘要: 题目要求计算二叉树的最大深度,即从根节点到最远叶子节点的最长路径上的节点数。解决方法是使用递归:若节点为空则返回0,否则返回左右子树的最大深度加1。示例1输入[3,9,20,null,null,15,7]输出3,示例2输入[1,null,2]输出2。时间复杂度O(n),空间复杂度O(h)(h为树高)。代码简洁,通过递归即可实现。
2025-11-13 14:52:13
280
原创 94. 二叉树的中序遍历
摘要:本文介绍了二叉树的中序遍历实现方法。给定二叉树的根节点root,通过递归算法按照左子树-根节点-右子树的顺序遍历,将节点值存入结果列表。提供三个示例说明不同输入情况下的输出结果,包括空树和单节点树。代码实现采用C++的TreeNode结构定义,通过递归函数zhongxu完成遍历,最终返回存储节点值的有序列表。算法时间复杂度为O(n),空间复杂度为O(n),适用于节点数在0-100范围内的二叉树。
2025-11-13 14:48:22
346
原创 146. LRU 缓存
本文介绍了一个LRU缓存的设计实现方案。该数据结构要求在O(1)时间内完成get和put操作,通过双向链表维护使用顺序,哈希表实现快速查找。当缓存容量超出限制时,自动淘汰最久未使用的项。实现中使用带头尾节点的双向链表,每次访问后将节点移至链表头部表示最近使用,尾部节点即为待淘汰项。put操作需处理已存在键的更新和容量超限时的淘汰机制。该方案满足LRU缓存的核心需求,通过哈希表和双向链表的组合实现了高效的操作性能。
2025-11-12 16:14:19
414
原创 234. 回文链表
摘要:本文介绍了一个判断单链表是否为回文结构的算法。通过统计链表长度,找到中间节点,反转后半部分链表,然后逐一比较前后半部分节点的值来判断回文性。算法时间复杂度为O(n),空间复杂度为O(1)。关键步骤包括:1)计算链表长度;2)定位中间节点;3)反转后半部分;4)值比较验证回文性。对于长度为1或0的链表直接返回true。该方法高效解决了回文链表的判断问题。
2025-11-11 20:28:30
158
原创 19. 删除链表的倒数第 N 个结点
摘要:本文介绍如何删除链表的倒数第N个节点。使用双指针法,快指针先移动N步,然后快慢指针同步移动直至快指针到达链表末尾,此时慢指针指向待删除节点的前驱节点。该方法能在一次遍历中完成操作,时间复杂度为O(n)。示例代码演示了这种高效解法,适用于链表长度为1到300之间的情形。
2025-11-10 17:33:59
285
原创 2. 两数相加
本文给出了一个解决"两数相加"问题的算法实现。题目要求将两个逆序存储数字的链表相加,返回同样逆序的结果链表。该算法首先遍历两个链表,将对应节点的值相加;然后处理进位问题,确保每个节点只存储一位数字。代码处理了链表长度不同和进位传播的情况,时间复杂度为O(n),其中n为较长链表的长度。这个解法适用于链表长度在1-100之间的场景,能够正确处理各种边界条件如全零输入和多进位情况。
2025-11-10 17:22:41
479
原创 142. 环形链表 II
摘要:该题要求检测链表中是否存在环,并返回环的起始节点。使用快慢指针法,快指针每次走两步,慢指针每次走一步。当两指针相遇时,将其中一个指针重置到链表头,然后两指针以相同速度前进,再次相遇的节点即为环的起点。若无环则返回null。示例1中,输入[3,2,0,-4](环在节点2处),返回索引为1的节点。该方法时间复杂度O(n),空间复杂度O(1)。
2025-11-10 14:59:54
544
原创 141. 环形链表
摘要:本文介绍了使用快慢指针算法检测链表是否存在环的方法。给定链表头节点,快指针每次移动两步,慢指针每次移动一步,若快慢指针相遇则存在环,否则无环。算法时间复杂度O(n),空间复杂度O(1)。提供了Java实现代码示例,通过判断指针是否相遇来返回true或false。
2025-11-10 14:35:42
892
原创 206. 反转链表
摘要:本文介绍了反转单链表的两种解决方案。题目要求将给定链表反转并返回新链表头节点。示例展示了输入输出格式。解法包括迭代法和递归法,文中提供了迭代法的Java实现代码:通过遍历链表,逐步将每个节点移到新链表头部,最终返回反转后的链表。算法时间复杂度O(n),空间复杂度O(1)。该题是常见面试题,要求掌握两种解法。
2025-11-08 15:03:24
218
原创 148. 排序链表
摘要:本文给出了一个链表排序问题的解决方案。题目要求将给定链表按升序排列,并能在O(n log n)时间复杂度和常数空间复杂度下完成。采用归并排序算法实现:1)计算链表长度;2)递归地分割链表;3)合并已排序的子链表。关键点包括:正确断开链表、处理边界条件以及高效的节点合并。该方法满足题目对时间复杂度的要求,且空间复杂度为常数级(递归栈空间不计)。
2025-11-06 19:14:29
117
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅