- 博客(126)
- 收藏
- 关注
原创 LeetCode--46.全排列(回溯算法)
摘要 本文解决了生成不含重复数字数组所有全排列的问题。通过回溯算法实现:维护一个路径列表记录当前排列,当路径长度等于数组长度时保存结果。使用used数组标记元素使用状态,每层递归都从数组起始位置遍历,选择未被使用的元素加入路径,递归完成后回溯恢复状态。时间复杂度O(n×n!),空间复杂度O(n)用于递归栈和路径存储。示例展示了算法对[1,2,3]、[0,1]等输入的排列生成结果。
2026-06-16 21:38:44
548
原创 LeetCode--491.递增子序列(回溯算法)
解题思路 这道题要求找出数组中所有不同的递增子序列,序列长度至少为2。由于数组未排序且可能包含重复元素,需要使用回溯算法结合剪枝策略来高效解决问题。 关键点: 回溯框架:通过递归遍历所有可能的子序列组合 树层去重:使用HashSet记录当前层已使用的数字,避免重复计算 递增判断:确保新加入数字不小于序列最后一个数字 结果收集:当路径长度≥2时保存结果 实现细节: 不排序数组,保持原始顺序 每层递归维护独立的used集合,防止同层重复 及时剪枝,跳过不满足递增条件的数字 注意回溯时要恢复状态 该算法时间复杂度
2026-06-16 21:38:11
174
原创 LeetCode--90.子集II(回溯算法)
摘要 该算法解决子集II问题,用于生成包含重复元素数组的所有不重复子集。核心思路是回溯算法配合剪枝策略,通过排序数组和标记使用状态来避免重复子集。具体步骤:1) 对数组排序使相同元素相邻;2) 使用回溯法递归构建子集;3) 通过检查与前一个元素的相等性及使用状态(used数组)来跳过同一层的重复元素。时间复杂度为O(n*2^n),空间复杂度为O(n)。示例:输入[1,2,2]输出[[],[1],[1,2],[1,2,2],[2],[2,2]]。
2026-06-16 21:37:25
233
原创 LeetCode--78.子集(回溯算法)
摘要 该问题要求生成给定整数数组的所有可能子集(幂集)。使用回溯算法解决,通过递归遍历所有可能的组合。算法维护一个当前路径path,在每一步将路径加入结果集,然后依次选择后续元素进行递归,最后回溯撤销选择。时间复杂度为O(2^n),空间复杂度为O(n)。示例输入[1,2,3]将输出包含空集在内的8个子集。
2026-06-16 21:36:44
184
原创 LeetCode--93.复原IP地址(回溯算法)
题目概述 给定一个数字字符串,要求生成所有可能的有效IP地址。有效IP地址由4个0-255之间的整数组成,不能有前导零,各部分用点分隔。 解题思路 采用回溯算法递归求解: 每次处理一段可能的IP段(1-3位数字) 检查当前段是否合法(0-255、无前导零) 当放置3个点后,检查剩余部分是否合法 合法则收集结果,否则回溯尝试其他分割方式 关键点 使用StringBuilder动态构建IP地址 通过count变量跟踪已放置的点数 isValid函数验证IP段的合法性 回溯时注意状态恢复(删除已添加的段和点) 算
2026-06-16 21:36:06
210
原创 LeetCode--131.分割回文串(回溯算法)
摘要 该题要求将字符串分割成多个回文子串,返回所有可能的分割方案。解题使用回溯算法,从字符串起始位置开始,逐步尝试所有可能的切割点。当发现某个子串是回文时,将其加入当前路径,并递归处理剩余部分。处理完成后回溯撤销选择。使用双指针法判断子串是否为回文。最终所有有效分割方案会被收集到结果列表中。时间复杂度为O(n*2^n),空间复杂度为O(n^2)用于存储结果。
2026-06-15 21:37:58
217
原创 LeetCode--39. 组合总和(回溯算法)
这篇文章介绍了解决组合总和问题的回溯算法。给定一个无重复元素的整数数组和目标值,需要找出所有能使数字和等于目标值的不同组合,同一数字可重复使用。 关键点: 使用回溯算法遍历所有可能的组合 对数组进行排序以便剪枝优化 通过维护当前路径和路径和来跟踪组合状态 递归时保持当前索引不变实现数字重复使用 当路径和超过目标值时提前终止无效分支 该算法通过排序后剪枝和回溯策略高效地找到所有解,避免了不必要的计算,时间复杂度取决于组合数量(题目保证不超过150个)。
2026-06-15 21:37:10
182
原创 LeetCode--17.电话号码的字母组合(回溯算法)
摘要 该算法解决了电话号码数字到字母组合的转换问题。使用回溯法遍历所有可能的字母组合:首先建立数字到字母的映射表,然后将输入数字字符串转换为数字数组。通过递归回溯函数,依次选择当前数字对应的每个字母,递归处理下一个数字,完成组合后回溯撤销选择。当组合长度等于数字个数时,将结果存入列表。时间复杂度为O(3^N * 4^M),其中N是映射到3字母的数字数,M是映射到4字母的数字数。空间复杂度为O(N)用于递归调用栈。
2026-06-15 21:36:10
226
原创 LeetCode--216.组合总和III(回溯算法)
摘要 本题要求找出所有由1-9数字组成、不重复使用且和为n的k数字组合。采用回溯算法解决,通过递归遍历所有可能组合,关键点在于剪枝优化:当当前和超过目标值或剩余数字不足时提前终止搜索。算法维护当前组合路径和总和,在递归过程中动态更新,找到符合条件的组合时将其加入结果列表。时间复杂度受组合数限制,空间复杂度主要由递归栈深度决定。示例展示了不同输入对应的输出组合情况。
2026-06-15 21:35:20
226
原创 LeetCode--538.把二叉搜索树转换为累加树(二叉树)
摘要 本题要求将二叉搜索树转换为累加树,即每个节点的值变为原值加上所有比它大的节点值的总和。解题关键在于利用二叉搜索树的性质,采用"右-根-左"的逆中序遍历顺序,这样可以从大到小访问节点。在遍历过程中,维护一个pre指针记录前一个(即更大)的节点,将pre节点的值(已累加过的)加到当前节点上。这种方法通过递归实现,时间复杂度为O(n),空间复杂度为O(n)(递归栈空间)。代码简洁高效,完美利用了BST的有序性和递归特性。
2026-06-15 21:32:50
559
原创 LeetCode--108.将有序数组转换为二叉搜索树(二叉树)
摘要: 题目要求将升序数组转换为高度平衡的二叉搜索树(BST)。通过递归方法,每次选择数组中间元素作为根节点,确保左右子树节点数接近,从而维持平衡性。左子树由中间元素左侧的子数组构建,右子树由右侧子数组构建。该算法时间复杂度为O(n),空间复杂度为O(logn)(递归栈深度)。示例表明,对于输入[-10,-3,0,5,9],可能输出[0,-3,9,-10,null,5]等合法BST结构。
2026-06-14 20:56:19
181
原创 LeetCode--669. 修剪二叉搜索树(二叉树)
本文介绍了如何修剪二叉搜索树(BST),使其所有节点值都在给定区间[low, high]内。通过递归处理,当节点值小于low时,直接剪掉左子树;当节点值大于high时,剪掉右子树。对于合法节点,递归修剪其左右子树并重新连接。该方法保证了修剪后的树仍保持BST结构,且时间复杂度为O(n)。图解和代码展示了修剪过程,适用于节点数在1到10^4范围的BST。
2026-06-14 20:53:47
162
原创 LeetCode--450.删除二叉搜索树中的节点(二叉树)
本文介绍了如何在二叉搜索树(BST)中删除指定值的节点。删除操作需要保持BST的性质不变,分为三种情况处理: 目标节点无左子树:直接返回右子树。 目标节点无右子树:直接返回左子树。 目标节点有左右子树:将右子树接到左子树的最右节点(最大值节点)下,再返回左子树作为新节点。 算法通过递归查找目标节点,时间复杂度为O(h),其中h是树的高度。示例代码展示了具体实现,确保删除后BST仍保持有序性。
2026-06-14 20:52:22
231
原创 LeetCode--701.二叉搜索树中的插入操作(二叉树)
摘要 本题要求在二叉搜索树(BST)中插入一个新节点,保持BST的性质不变。BST的特点是左子树节点值小于根节点,右子树节点值大于根节点。算法采用迭代方式:从根节点开始,比较插入值与当前节点值,小于则向左子树移动,大于则向右子树移动,直到找到空位置插入。若树为空,则直接创建新节点作为根节点。该方法时间复杂度为O(h),h为树高,空间复杂度O(1)。示例展示了不同情况下的插入结果。
2026-06-14 20:50:37
168
原创 LeetCode--1584. 连接所有点的最小费用(最小生成树/Prim算法/Kruskal算法)
摘要 该问题要求计算连接平面上多个点的最小总费用,其中连接费用为两点间的曼哈顿距离。解题核心是构建最小生成树(MST),可采用Kruskal或Prim算法。Kruskal通过排序边并查集合并连通分量,时间复杂度O(n² logn);Prim通过维护距离数组逐步扩展生成树,时间复杂度O(n²)。两种方法均能有效解决该问题,其中Prim更适合稠密图。代码实现展示了两种算法的具体步骤,包括边排序、并查集操作和距离更新等关键环节。
2026-06-14 20:48:43
918
原创 LeetCode--235. 二叉搜索树的最近公共祖先(二叉树)
该题目要求在二叉搜索树中找到两个节点的最近公共祖先。利用二叉搜索树的有序特性,可以通过比较节点值快速确定搜索方向。当两个目标节点值都小于当前节点时,向左子树搜索;当都大于当前节点时,向右子树搜索;否则当前节点即为最近公共祖先。提供了迭代和递归两种解法,时间复杂度均为O(n),空间复杂度迭代为O(1),递归为O(n)。算法高效利用了BST的特性,避免了不必要的遍历。
2026-06-10 16:33:23
190
原创 LeetCode--3691. 最大子数组总值 II(ST表+最大堆)
摘要 该题要求从数组中选取k个不同的非空子数组,使得这些子数组的(最大值-最小值)之和最大。关键解法是使用ST表快速查询区间极值,并结合最大堆贪心地选取当前最优解。具体步骤:1) 预处理构建log表及max/min的ST表;2) 初始化最大堆,存储所有可能子数组的差值;3) 每次取出堆顶元素(当前最大差值),并将其左右边界缩短后重新入堆,重复k次。该方法高效地解决了大规模数据的最优选择问题,时间复杂度主要取决于ST表构建和堆操作。
2026-06-10 15:12:54
358
原创 LeetCode--236. 二叉树的最近公共祖先(二叉树)
这道题目要求在二叉树中找到两个指定节点的最近公共祖先。采用后序遍历的递归方法,从底向上查找: 递归终止条件是当前节点为空时返回null 分别递归查找左右子树 处理四种情况: 当前节点是p或q时返回该节点 只在左子树找到时返回左子树结果 只在右子树找到时返回右子树结果 左右子树都找到说明当前节点就是最近公共祖先 该方法时间复杂度O(n),空间复杂度O(h),h为树高。通过深度优先的递归遍历,有效地定位了两个节点的最近公共祖先节点。
2026-06-03 16:15:45
178
原创 LeetCode--501.二叉搜索树中的众数(二叉树)
摘要 本文介绍了一个在二叉搜索树(BST)中寻找众数的算法。题目要求在BST中找出出现频率最高的所有元素。BST的特点是左子树节点值小于等于当前节点,右子树节点值大于等于当前节点。 算法采用中序遍历BST,利用BST的有序特性统计相邻相同值的出现次数。维护当前计数、最大计数和结果列表,当发现更高频率值时更新结果。最终将结果列表转为数组返回。 该方法时间复杂度为O(n),空间复杂度为O(1)(不考虑递归栈),满足题目进阶要求。示例表明算法能正确处理单众数和多众数情况。
2026-06-03 16:14:36
189
原创 LeetCode--530.二叉搜索树的最小绝对差(二叉树)
摘要 该题目要求在二叉搜索树中找到任意两个不同节点值之间的最小绝对差。由于二叉搜索树的中序遍历结果是有序的,最小差值必定出现在相邻节点之间。算法采用中序遍历,在遍历过程中维护前驱节点,并计算当前节点与前驱节点的差值,更新最小值。时间复杂度为O(n),空间复杂度为O(1)(不考虑递归栈)。示例输入[4,2,6,1,3]输出1,[1,0,48,null,null,12,49]也输出1。
2026-06-03 16:13:10
237
原创 LeetCode--98.验证二叉搜索树(二叉树)
摘要 本题要求验证给定的二叉树是否是有效的二叉搜索树(BST)。BST需满足:左子树所有节点值小于当前节点,右子树所有节点值大于当前节点,且左右子树也必须是BST。解题关键在于利用BST的中序遍历结果应为严格递增序列的特性。通过递归中序遍历,记录前驱节点并与当前节点比较,若不满足递增关系则判定无效。时间复杂度和空间复杂度均为O(n)。
2026-06-03 16:11:24
215
原创 深度学习入门(鱼书)第4章笔记——神经网络的学习
本章介绍了神经网络学习的基本原理与实现流程。首先说明了训练数据与测试数据的作用,以及泛化能力和过拟合的概念。随后引入损失函数作为学习目标,重点讲解了均方误差和交叉熵误差。为了优化损失函数,进一步介绍了数值微分、偏导数、梯度以及梯度下降法,并说明学习率对训练效果的重要影响。在此基础上,实现了神经网络权重梯度的计算,以及基于 Mini-Batch 的随机梯度下降(SGD)学习流程。最后通过 TwoLayerNet 在 MNIST 数据集上的训练实验,验证了神经网络能够通过不断更新参数提升识别精度。
2026-06-03 16:09:34
651
原创 LeetCode--700.二叉搜索树中的搜索(二叉树)
摘要 题目要求在二叉搜索树(BST)中查找值为 val 的节点,并返回以该节点为根的子树。若节点不存在则返回 null。二叉搜索树的特性是左子树节点值均小于根节点,右子树节点值均大于根节点。 解法分析: 迭代法:通过循环遍历树,根据当前节点值与目标值的大小关系决定向左或向右子树移动,直到找到目标节点或遍历结束。 递归法:递归地在左或右子树中查找目标值,利用BST的特性缩小搜索范围。 两种方法均利用BST的有序性实现高效查找,时间复杂度为O(h),其中h为树的高度。空间复杂度迭代法为O(1),递归法为O(h)
2026-05-27 19:23:35
89
原创 LeetCode--617.合并二叉树(二叉树)
本文提出了一种合并两棵二叉树的递归算法。当两个节点重叠时,新节点的值为两者之和;若只有一个节点存在,则直接采用该节点。算法采用前序遍历方式,递归处理左右子树,并以root1为基础构建合并后的树。时间复杂度为O(min(m,n)),其中m和n分别是两棵树的节点数。该方法简洁高效,适用于节点数在2000以内、节点值范围在±10^4的情况。示例表明算法能正确合并不同结构的二叉树。
2026-05-27 19:22:32
46
原创 LeetCode--654.最大二叉树(二叉树)
本文介绍了如何根据给定数组构建最大二叉树的算法。该算法通过递归方式实现:首先找到当前子数组中的最大值作为根节点,然后分别在最大值左侧和右侧的子数组中递归构建左右子树。代码采用Java实现,使用左右区间索引来标记当前处理的子数组范围,并通过遍历查找最大值及其索引。时间复杂度为O(n^2),空间复杂度为O(n)。该算法适用于所有元素互不相同的整数数组,能够高效地构建出符合要求的二叉树结构。
2026-05-26 21:05:20
28
原创 LeetCode--105.从前序和中序遍历序列构造二叉树(二叉树)
摘要 本文介绍了如何根据二叉树的前序遍历和中序遍历序列重建二叉树。给定两个无重复元素的数组 preorder 和 inorder,分别表示二叉树的先序和中序遍历结果,算法通过递归方式构造二叉树并返回根节点。关键步骤包括:1) 使用哈希表存储中序遍历的值与索引映射;2) 在先序序列中确定根节点;3) 在中序序列中找到根节点位置,划分左右子树;4) 递归处理左右子树。该方法时间复杂度为O(n),空间复杂度为O(n),适用于大规模输入。示例展示了输入输出格式及算法执行过程。
2026-05-26 21:03:34
68
原创 LeetCode--106.从中序与后序遍历序列构造二叉树(二叉树)
摘要 本文探讨了如何根据二叉树的中序遍历和后序遍历结果重建原始二叉树。通过分析两种主要方法:构造新数组法和记录下标法。构造新数组法通过创建左右子树的临时数组进行递归构建,而记录下标法则通过维护原始数组的索引范围来优化空间复杂度。两种方法的核心思路都是利用后序遍历的最后一个元素确定根节点,再根据中序遍历分割左右子树,最后递归构建整棵树。文章提供了Java代码实现,并指出记录下标法避免了频繁创建新数组,具有更好的空间效率。
2026-05-26 21:02:30
78
原创 LeetCode--113.路径总和 II(二叉树)
这道题目要求找出二叉树中所有从根节点到叶子节点的路径,使得路径上节点值之和等于给定的目标和。解题思路采用深度优先搜索(DFS)进行回溯遍历,维护当前路径和剩余目标值。当到达叶子节点且剩余值为0时,将当前路径加入结果集。关键点在于正确拷贝路径列表,避免回溯修改影响已存储的结果。算法时间复杂度为O(n^2),空间复杂度为O(n),其中n是节点数量。需要注意处理空树和负数节点值的情况,以及正确实现路径的回溯机制。
2026-05-26 21:00:57
36
原创 深度学习入门(鱼书)第3章笔记——神经网络
神经网络摘要 神经网络通过自动学习权重参数解决了感知机需要人工设定权重的问题。其核心结构包括输入层、隐藏层和输出层,通过激活函数实现非线性转换。与感知机使用阶跃函数不同,神经网络主要采用sigmoid和ReLU等平滑激活函数,使输出连续且可微分,这对网络的学习至关重要。sigmoid函数输出范围在(0,1)之间,形成平滑曲线;而ReLU函数在正区间保持线性,负区间输出为零。这些非线性激活函数使得多层神经网络能够学习复杂特征,避免了线性函数导致的网络退化问题,是神经网络实现强大学习能力的关键所在。
2026-05-26 20:58:05
1370
原创 LeetCode--112. 路径总和(二叉树)
本文介绍了判断二叉树中是否存在根节点到叶子节点的路径和等于给定目标值的算法。通过递归遍历二叉树,在遇到叶子节点时检查当前路径和是否等于目标值。清晰版本采用回溯法处理左右子树,简洁版本则直接递归减去当前节点值。两种方法都能有效解决问题,时间复杂度为O(n),空间复杂度为O(h),其中n为节点数,h为树高度。关键点在于正确处理递归终止条件和路径和的累计计算。
2026-05-21 21:32:05
34
原创 LeetCode--513.找树左下角的值(二叉树)
本文探讨了如何找出二叉树最底层最左边节点的值。提供了两种解法:迭代法和递归法。迭代法采用层序遍历,记录每层第一个节点的值,最终返回最后一层的第一个节点值。递归法通过前序遍历,维护最大深度和结果值,当遇到更深层的叶子节点时更新结果。两种方法都能有效解决问题,时间复杂度均为O(n),空间复杂度取决于树的结构。示例代码展示了具体实现,适用于节点数在[1,10^4]范围内的二叉树。
2026-05-21 20:34:10
114
原创 深度学习入门(鱼书)第2章笔记——感知机
摘要 本章介绍了感知机(Perceptron)的基本概念和工作原理。感知机是一种简单的人工神经元模型,接收多个输入信号并输出0或1。其核心计算过程是对输入信号加权求和后与阈值比较,决定是否激活输出。通过调整权重和偏置参数,感知机可以实现与门、与非门、或门等基本逻辑电路功能。本章还展示了如何使用Python和NumPy实现这些逻辑门,并解释了权重决定输入信号重要性、偏置控制神经元激活难易程度的关键概念。感知机作为神经网络的基础,为后续深度学习模型提供了重要思想框架。
2026-05-21 20:31:36
489
原创 LeetCode--404.左叶子之和(二叉树)
本文介绍了如何计算二叉树中所有左叶子节点的和。通过递归遍历二叉树,判断当前节点的左子节点是否为叶子节点(即无左右子节点),若是则累加其值。算法时间复杂度为O(n),空间复杂度为O(h),其中n为节点数,h为树高。示例表明,对于输入[3,9,20,null,null,15,7],输出24(9+15);输入[1]则输出0。该方法简洁高效地解决了左叶子求和问题。
2026-05-20 21:34:43
130
原创 LeetCode--257. 二叉树的所有路径(二叉树)
本文实现了一个二叉树所有根到叶子路径的查找算法。采用深度优先遍历(DFS)策略,通过递归遍历每个节点,并在访问叶子节点时记录当前路径。算法使用回溯思想维护路径节点列表,在递归返回时移除已访问节点。时间复杂度为O(n),空间复杂度为O(h),其中n为节点数,h为树高。最终返回所有路径字符串,格式为"1->2->5"的形式。
2026-05-20 21:33:28
115
原创 LeetCode--110.平衡二叉树(二叉树)
本文介绍了如何判断一个二叉树是否为平衡二叉树。平衡二叉树要求所有节点的左右子树高度差不超过1。通过递归计算每个节点的高度,并在过程中检查左右子树高度差,若超过1则返回-1作为不平衡标志。最终根据根节点高度是否为-1来判断整棵树是否平衡。该方法时间复杂度为O(n),空间复杂度为O(h),其中h为树的高度。示例显示该方法能正确识别平衡和非平衡二叉树的情况。
2026-05-19 21:38:21
32
原创 LeetCode--222.完全二叉树的节点个数(二叉树)
本文提出了一种高效计算完全二叉树节点数的方法。算法利用完全二叉树的性质,通过判断左右子树高度是否相等来确定是否为满二叉树。如果是满二叉树,直接使用公式2^h-1计算节点数;否则递归处理左右子树。该方法时间复杂度优于O(n),在最坏情况下为O(log^2 n),空间复杂度为O(log n)。通过结合高度比较和递归,实现了对完全二叉树节点数的快速统计。
2026-05-19 19:34:15
47
原创 深度学习入门(鱼书)第1章笔记——Python 基础
本文介绍了Python编程语言的基础知识及其在深度学习中的应用。主要内容包括:Python的特点(简单易读、适合科学计算)、基本语法(变量、数据类型、列表、字典、布尔运算)、控制结构(if语句、for循环)、函数定义和类的使用。特别强调了NumPy库在数组和矩阵计算中的重要性,这是深度学习实现的关键工具。文章还提供了Python解释器的交互示例和脚本文件的编写方法,适合从初学者到专业人士的不同层次读者学习使用Python进行深度学习开发。
2026-05-19 19:32:23
1383
原创 LeetCode--572.另一棵树的子树(二叉树)
方法思路 要判断一棵树 subRoot 是否是另一棵树 root 的子树,可以采用递归的方法。基本思路是:首先检查 root 和 subRoot 是否完全相同;如果不是,则递归检查 root 的左子树或右子树是否包含 subRoot。 具体步骤如下: 检查相同树:定义一个辅助函数 isSameTree,用于判断两棵树是否完全相同。如果两棵树都为空,返回 true;如果其中一棵为空而另一棵不为空,返回 false;否则比较当前节点的值,并递归比较左右子树。 检查子树:在 isSubtree 函数中,首先检查
2026-05-18 20:54:25
142
原创 LeetCode--100.相同的树(二叉树)
摘要 本文探讨如何判断两棵二叉树是否相同。通过递归方法,比较两棵树的节点值和结构:若两节点均为空则相同;若仅一个为空则不同;否则递归比较当前节点值及其左右子树。该方法简洁高效,时间复杂度O(n),空间复杂度O(h),其中n为节点数,h为树高。示例验证了算法的正确性,适用于节点数在100以内的二叉树比较。
2026-05-18 20:52:57
82
原创 LeetCode--101. 对称二叉树(二叉树)
本文探讨了如何判断二叉树是否轴对称的问题。提供了两种解法:递归法和迭代法。递归法通过比较左右子树的对称节点值是否相等来判断;迭代法则借助队列进行层序遍历,逐层检查对称位置的节点。两种方法都能有效解决问题,时间复杂度均为O(n)。递归法空间复杂度为O(h),迭代法为O(n),其中h为树高,n为节点数。文章通过示例和代码展示了两种实现方式,适用于不同场景下的对称性检查需求。
2026-05-16 20:18:05
101
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅