自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(68)
  • 收藏
  • 关注

原创 剑指offer——动态规划:把数字翻译成字符串

摘要:该算法解决数字字符串译码问题。"0"返回0,"10"/"20"返回1。检查无效"0"组合后,使用动态规划:初始化dp数组为1,遍历字符串时,若当前和前一字符组成有效数字(11-26),则dp[i]=dp[i-1]+dp[i-2],否则dp[i]=dp[i-1]。最终返回dp[n]作为总译码方式。时间复杂度O(n),空间复杂度O(n)。

2025-08-05 05:01:17 185

原创 剑指offer——动态规划:连续子数组的最大和(二)

摘要:本文提出了一种基于动态规划和双指针的算法,用于寻找数组中最大连续子数组和及其对应区间。算法使用动态规划数组记录到每个位置的最大子数组和,通过比较"延续前序子数组"与"从当前元素重新开始"两种情况确定最优解。同时维护双指针跟踪当前子数组区间,当和更大或和相等但子数组更长时更新结果。最后返回最大和对应的子数组。该方法在O(n)时间复杂度和O(n)空间复杂度下解决问题。

2025-08-05 04:56:07 109

原创 剑指offer——树:二叉搜索树的第k个节点

本文介绍了一种通过中序遍历查找二叉搜索树中第k个节点的方法。算法利用递归进行中序遍历(左-根-右),使用计数器记录当前访问的节点序号,当计数器等于k时即找到目标节点。若遍历完所有节点仍未找到,则返回-1。这种方法的时间复杂度为O(n),空间复杂度为O(h),其中h为树的高度,适用于任意二叉搜索树结构。

2025-08-04 07:28:23 103

原创 剑指offer——树:二叉树中和为某一值的路径(二)

摘要:本文介绍了一种在二叉树中查找所有路径和等于目标值的算法。使用深度优先搜索(DFS)递归遍历二叉树,用path数组记录当前路径。当访问节点时将其值加入path,并更新剩余目标值。若遇到叶子节点且剩余值为0,则将当前路径加入结果集ret。递归完成后回溯,移除当前节点值继续搜索。时间复杂度O(n),空间复杂度O(n)。

2025-08-04 07:28:20 148

原创 剑指offer——树:把二叉树打印成多行

该代码实现了二叉树的层序遍历,使用队列逐层处理节点。算法首先检查根节点是否为空,若为空直接返回空数组。否则将根节点入队,通过循环处理队列中的节点:每次取出当前层的所有节点,记录它们的值,并将它们的左右子节点加入队列以供下一层处理。最终返回一个二维数组,其中每个子数组代表二叉树的一层节点值。时间复杂度为O(n),空间复杂度为O(n),适用于标准的二叉树层序遍历需求。

2025-08-03 07:43:07 169

原创 剑指offer——队列&栈:滑动窗口的最大值

摘要:本文介绍了一种使用双端队列高效求解滑动窗口最大值的算法。通过维护一个单调递减队列,每次新元素入队时移除比它小的队尾元素,并检查队首是否超出窗口范围。当窗口形成时,队首即为当前窗口最大值。时间复杂度O(n),空间复杂度O(k),其中n为数组长度,k为窗口大小。代码实现清晰,先处理特殊情况,然后通过遍历数组维护双端队列,最终返回各窗口最大值组成的数组。

2025-08-03 07:35:42 104

原创 剑指offer——链表:复杂链表的复制

本文介绍了一种复制带随机指针链表的算法。该算法通过三次遍历实现:第一次遍历插入复制节点,第二次根据原节点设置复制节点的随机指针,第三次将链表拆分为原链表和复制链表。时间复杂度为O(n),空间复杂度为O(1),无需额外空间。代码实现中处理了空节点和边界条件,最终返回复制链表的头节点。该方法高效地解决了带随机指针链表的深拷贝问题。

2025-08-02 08:43:33 113

原创 剑指offer——树:二叉搜索树的后序遍历序列

摘要:该算法通过递归验证后序遍历序列是否满足二叉搜索树特性。以序列末位为根节点,从后向前找到第一个小于根节点的元素作为分界点,划分左右子树。检查左子树元素是否都小于根节点,右子树是否都大于根节点,并递归验证左右子树序列。当序列为空返回false,单个节点返回true。时间复杂度为O(n^2),空间复杂度为O(n)。

2025-08-02 08:41:23 101

原创 剑指offer——树:树的子结构

本文提出了一种递归方法来判断二叉树B是否为二叉树A的子树。算法分为两个部分:主函数HasSubtree递归遍历树A的每个节点,辅助函数recursion递归比较当前节点及其左右子树是否与树B完全匹配。当任一节点匹配成功即返回true。边界条件处理了空树情况,确保程序健壮性。通过递归调用实现了高效的子树匹配检查,时间复杂度为O(n*m),其中n和m分别为两棵树的节点数。

2025-08-01 08:38:28 132

原创 剑指offer——链表:删除链表中重复的结点

摘要:本文介绍了一种删除链表中所有重复节点的算法。通过创建一个虚拟头节点来简化处理,使用指针遍历链表,当发现相邻节点值相同时,跳过所有重复节点。时间复杂度为O(n),空间复杂度O(1)。关键点在于使用虚拟头节点处理边界情况,以及双指针法高效跳过重复节点。

2025-08-01 08:31:09 167

原创 剑指offer——链表:链表中环的入口结点

摘要:该代码实现了一种检测链表中环并找到环入口的方法。采用快慢指针策略,快指针每次移动两步,慢指针每次移动一步,当两者相遇时说明存在环。然后将快指针重置到链表头,并以相同速度移动快慢指针,再次相遇的节点即为环入口。时间复杂度O(n),空间复杂度O(1)。代码包含链表结构定义和入口节点查找函数,通过条件判断处理空链表和无环情况。

2025-07-31 10:14:36 142

原创 剑指offer——其他算法:调整奇数使奇数位于偶数前面

本文介绍了一种将数组中的奇数和偶数分离的算法。算法采用双指针法,从数组末尾开始扫描,当遇到奇数时将其与最前面的元素交换,并移动左指针;遇到偶数则继续向前扫描。这种方法保证了所有奇数都被移动到数组前端,而偶数则留在后端。算法的时间复杂度为O(n),空间复杂度为O(1),只需要一次遍历即可完成数组重排。该解法简洁高效,适用于需要保持相对顺序不变的情况。

2025-07-31 10:08:01 94

原创 剑指offer——动态规划:买卖股票的最好时机

该算法通过动态维护股票最低价和最大收益来求解股票买卖最佳时机。初始化最低价Min为第一天价格,最大收益res为0。遍历股票价格,若当前价格低于Min则更新Min,同时计算当前价格与Min的差值,更新res为最大值。最终返回res即为可获得的最大利润。算法时间复杂度O(n),空间复杂度O(1),高效解决了股票买卖问题。

2025-07-30 08:04:55 119

原创 剑指offer——位运算:二进制中1的个数

本文介绍了一种计算32位整数中1的个数的算法。通过循环32次,每次将数字1左移i位生成掩码,与原数进行按位与操作。若结果非零则计数器加1。该方法逐位检测整数n的每一位是否为1,最终返回1的总个数。代码示例展示了完整的实现过程,时间复杂度为O(1)。

2025-07-30 07:56:34 122

原创 剑指offer——其他算法:数组中出现两次的元素

本文介绍了一种使用哈希表统计数字出现次数的方法。算法遍历数组,用哈希表记录每个数字的出现次数,当发现某个数字出现次数超过数组长度一半时立即返回该数字。这种方法时间复杂度为O(n),空间复杂度为O(n),能高效找出数组中出现次数超过一半的数字。代码实现简洁,适用于处理类似统计问题。

2025-07-28 20:35:20 98

原创 剑指offer——其他算法:打印从1到最大的n位数

本文介绍了一种生成n位数字序列的算法。通过循环计算最大n位数(如n=2时为99),再生成1到该最大值的所有整数存入数组。核心思路是先用循环构造形如11...1的基数,然后乘以9得到最大值,最后遍历填充数组。该方法简洁高效地解决了n位数序列生成问题,代码实现使用vector容器存储结果。

2025-07-28 20:16:38 163

原创 剑指offer——动态规划:跳台扩展问题

摘要:本文给出了解决跳台阶问题的动态规划方法。通过状态转移方程dp[i]=2*dp[i-1],其中dp[i]表示跳到第i级台阶的方法数。初始化dp[0]=1,dp[1]=1,然后依次计算dp[2]到dp[n]的值。该方法时间复杂度为O(n),空间复杂度为O(n),能够高效计算出跳到第n级台阶的所有可能方法数。

2025-07-27 10:57:56 86

原创 剑指offer——搜索算法:数字序列中某一位的数字

这是一个查找数字序列中第n位数字的算法解决方案。首先判断n是否为个位数直接返回。对于更大的n,通过确定所在位数段(1位、2位等),计算具体数字和该数字中的指定位数。算法主要分为四步:1)确定数字位数段;2)计算具体数字;3)确定数字中的位置;4)转换字符串并返回指定位。该解法时间复杂度为O(logn),空间复杂度为O(logn)。

2025-07-27 10:35:58 248

原创 剑指offer——动态规划:跳台阶

摘要:本文提供了一个递归方法解决跳台阶问题。当台阶数为0时返回0,1时返回1,2时返回2。对于更大的台阶数n,结果等于前两个台阶数结果之和,即f(n)=f(n-1)+f(n-2)。该方法体现了斐波那契数列的思想,但需要注意递归解法在n较大时可能存在效率问题。

2025-07-27 08:13:23 98

原创 剑指offer——队列&栈:包含main函数的栈

摘要:该文实现了一个带最小值的栈结构,使用主栈存储数据,辅助栈记录最小值。当压入元素时,若辅助栈为空或新值小于当前最小值,则同步压入辅助栈;弹出时若栈顶元素等于最小值则同步弹出辅助栈顶。查询最小值时直接返回辅助栈顶元素,保证时间复杂度为O(1)。核心思路是通过双栈配合维护动态最小值。(150字)

2025-07-27 07:59:58 100

原创 剑指offer——树:对称的二叉树

本文介绍了一种判断二叉树是否对称的方法。传统方法将节点值存入数组再比较,但存在效率问题。作者提出通过递归同时比较对应节点的方法:首先检查左右子树是否同时为空,若一空一非空则不对称;再比较节点值是否相等;最后递归比较左子树的左节点与右子树的右节点,以及左子树的右节点与右子树的左节点。该方法避免了空指针访问,时间复杂度为O(n),空间复杂度为O(h),其中n为节点数,h为树高。

2025-07-25 11:20:17 80

原创 剑指offer——队列&栈:翻转单词序列

这篇文章提出了一种反转字符串中单词顺序的方法。首先使用栈结构整体反转整个字符串,然后逐个单词再次反转,最后处理末尾单词。具体实现分为三步:1)将整个字符串压入栈后弹出实现整体反转;2)遍历反转后的字符串,遇到空格时弹出栈中字母完成单词反转;3)单独处理最后一个未反转的单词。该方法利用栈的先进后出特性实现字符串和单词的双重反转,时间复杂度为O(n),空间复杂度为O(n)。

2025-07-25 10:39:30 219

原创 剑指offer——树:二叉树中和为某一值的路径

该文介绍了一种使用栈模拟DFS遍历二叉树的方法,用于判断是否存在根到叶子的路径和等于给定值sum。算法首先处理空树情况,然后利用栈存储节点及其当前路径和,每次弹出栈顶元素检查:若是叶子节点且路径和等于sum则返回true,否则将其非空子节点及其更新后的路径和压入栈中。若遍历结束未找到符合条件的路径则返回false。这种方法通过迭代避免了递归开销,空间复杂度为O(n)。

2025-07-25 07:44:58 239

原创 剑指offer——树:判断是不是平衡二叉树

该代码实现了平衡二叉树的判断功能。平衡二叉树要求任意节点的左右子树高度差不超过1,同时左右子树本身也必须是平衡的。算法通过递归方式实现:deep函数计算子树深度,IsBalanced_Solution函数先检查当前节点左右子树高度差是否在1以内,再递归检查左右子树是否平衡。该方法时间复杂度为O(n^2),空间复杂度为O(n)(递归栈空间)。判断过程中既考虑了局部平衡性(当前节点),也保证了整体平衡性(所有子树)。

2025-07-25 07:37:44 111

原创 剑指offer——其他算法:构建乘积数组

该算法通过双层循环计算数组中每个元素除自身外的乘积。初始化结果数组为全1,外层循环遍历每个元素,内层循环计算其他元素的乘积并存入结果数组。时间复杂度为O(n²),空间复杂度为O(n)。虽然思路简单直观,但效率较低,适合小规模数据。

2025-07-23 10:12:13 248

原创 剑指offer——其他算法:第一个只出现一次的字符

摘要:该算法使用双重循环查找字符串中第一个不重复的字符。外层循环遍历每个字符,内层循环将该字符与其余所有字符比较。若发现重复则将标志位设为false并终止内循环,否则返回当前字符索引。时间复杂度为O(n²),空间复杂度O(1)。该方法直接但效率较低,适合短字符串处理。

2025-07-23 09:43:11 283

原创 剑指offer——链表:链表中倒数最后k个结点

摘要:本文提出了一种使用栈结构查找链表倒数第k个节点的解决方案。算法首先将链表节点依次压入栈中,然后弹出前k-1个元素,栈顶元素即为所求。该方法包含错误处理机制:当输入链表为空或k=0时返回空指针,并在栈操作后检查空栈情况。时间复杂度为O(n),空间复杂度为O(n)。代码实现简洁明了,通过栈操作将链表倒序访问问题转化为顺序处理。

2025-07-22 14:46:04 103

原创 剑指offer——树:从上往下打印二叉树

本文实现二叉树层序遍历算法。使用队列存储待处理节点,初始时将根节点入队。循环处理队列中的节点:取出队首节点值存入结果数组,若存在左右子节点则将其入队。最终返回包含所有节点值的数组,实现从上到下的层序遍历。时间复杂度O(n),空间复杂度O(n)。核心思路是利用队列先进先出的特性完成广度优先遍历。

2025-07-22 09:56:15 115

原创 剑指offer——链表:删除链表的节点

本文介绍了一种删除链表中指定值节点的算法。算法采用双指针法,处理了链表为空或头节点为目标节点的特殊情况。通过前驱指针prev和当前指针curr遍历链表,当找到目标节点时修改prev的next指针实现删除,最后返回头节点。代码实现简洁高效,时间复杂度为O(n),空间复杂度为O(1)。

2025-07-22 01:10:35 239

原创 剑指offer——树:二叉树的镜像

本文实现了一个二叉树的镜像翻转算法。通过递归方式,先判断节点是否为空,若非空则交换其左右子节点,然后递归处理左右子树。该方法简洁高效,时间复杂度为O(n),空间复杂度为O(h),其中h为树的高度。关键点在于使用临时变量完成节点交换,并确保递归处理所有子树。该实现适用于任何二叉树结构,能够正确生成原树的镜像版本。

2025-07-22 00:13:08 286

原创 剑指offer——链表:旋转数组的最小数字

文章摘要:本文介绍了两种查找旋转数组最小值的算法。暴力解法通过遍历数组比较元素找出最小值,时间复杂度O(n)。二分查找法通过比较中间值与右边界值,将搜索范围减半,时间复杂度优化至O(logn),适用于含重复元素的旋转数组。二分法通过调整左右指针逐步缩小范围,最终确定最小值位置。

2025-07-20 11:34:42 188

原创 剑指offer——链表:之字形打印链表

摘要:本文实现了一种基于队列的二叉树之字形层序遍历算法。采用广度优先搜索(BFS)策略,使用队列存储节点并按层处理。算法通过当前层数的奇偶性控制插入方向:偶数层从左到右插入,奇数层从右到左插入。代码中维护一个队列处理当前层节点,同时将子节点入队,并利用临时数组存储每层结果,最后合并到最终结果集中。该算法能有效实现二叉树的之字形遍历,时间复杂度为O(n),空间复杂度为O(n)。

2025-07-20 10:32:51 154

原创 剑指offer——链表:两个链表的第一个节点

本文实现了一个查找两个链表首个公共节点的算法。通过使用双指针技术,让指针l1和l2分别遍历链表1和链表2,当到达链表末尾时则切换到另一个链表头部继续遍历。由于两个指针最终会走过相同的总节点数,因此它们将在第一个公共节点处相遇。该算法时间复杂度为O(m+n),空间复杂度为O(1),无需额外存储空间。

2025-07-19 23:05:21 77

原创 剑指offer——链表:合并两个有序链表

本文实现了一个合并两个有序链表的算法。通过创建新链表头节点,使用双指针依次比较两个链表节点值,将较小值节点连接到新链表,直到其中一个链表遍历完,再将剩余节点直接连接。时间复杂度O(m+n),空间复杂度O(1)。该算法是处理有序链表合并问题的经典解法。

2025-07-19 23:00:14 125

原创 剑指offer——链表:反转链表

本文展示了一个反转单向链表的C++实现。通过定义三个指针pre、curr和next,算法在遍历链表时逐个反转节点指向。初始时pre为nullptr,curr指向头节点;每次迭代保存curr的下一个节点,反转指针指向pre,然后移动pre和curr直至链表末尾。最终返回pre作为新链表的头节点。该算法时间复杂度O(n),空间复杂度O(1),能高效完成链表反转。

2025-07-19 22:52:58 133

原创 剑指offer——搜索算法:二维数组中的查找

摘要:本文展示了两种在二维数组中查找目标值的C++解法。暴力解法通过双重循环遍历数组元素,时间复杂度为O(n²);二分查找解法对每行数组进行二分搜索,时间复杂度为O(nlogn)。两种方法均能正确判断目标值是否存在,但二分查找在效率上更优。代码使用了C++11的auto语法简化遍历操作。

2025-07-19 03:04:42 101

原创 剑指offer——动态规划:斐波那契数列

当n为 1 或 2 时返回 1,否则返回前两项 Fibonacci(n-1)与 Fibonacci(n-2)的和。

2025-07-19 02:58:13 120

原创 剑指offer——其他算法:替换空格

这段代码存在多个错误:1)错误使用类型名string而非参数名s;2)误将'\n'作为终止条件而非'\0';3)错误地对结束符'\0'进行替换;4)直接修改遍历中的字符串长度。修正方案是新建结果字符串,遍历原字符串时遇到空格就追加%20,否则追加原字符。该方法避免了直接修改输入字符串带来的问题,正确实现了空格替换功能。

2025-07-19 02:49:41 294

原创 力扣hot100——树:二叉树的最大深度

该代码使用递归和动态规划方法计算二叉树的最大深度。通过定义TreeNode结构体表示二叉树节点,Solution类中的maxDepth函数递归地计算左右子树的最大深度,取较大值并加1(当前节点深度)。当节点为空时返回0作为递归终止条件。时间复杂度O(n),空间复杂度O(h),其中n为节点数,h为树高。

2025-07-17 00:03:17 102

原创 力扣hot100——双指针:移动0

本文介绍了一种移动数组中零元素的高效算法。该算法采用双指针方法,首先遍历数组将所有非零元素前移,然后从非零元素末尾开始将剩余位置填充为零。通过两次遍历(时间复杂度O(n))完成了数组元素的重排,无需逐个比较元素,提高了执行效率。这种方法既保持了非零元素的原始顺序,又实现了将所有零元素移动到数组末尾的要求。

2025-07-17 00:01:05 133

Arduino实战之水位传感器

Arduino实战之水位传感器

2024-07-21

Arduino实战之火焰传感器

Arduino实战之火焰传感器

2024-07-21

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除