自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 110. 平衡二叉树

本文介绍了判断二叉树是否为平衡二叉树的递归解法。平衡二叉树要求每个节点的左右子树高度差不超过1,且左右子树也都是平衡的。算法采用后序遍历,自底向上计算每个节点的高度:若左右子树高度差超过1则返回-1表示不平衡;否则返回当前子树高度。最终只需检查根节点高度是否为-1即可判断整棵树是否平衡。该方法时间复杂度O(n),空间复杂度O(h),其中h为树高。通过递归同时计算高度和平衡性,避免了重复计算。

2025-07-29 22:38:37 395

原创 222. 完全二叉树的节点个数

摘要 本文提出了一种递归方法计算完全二叉树的节点数。对于任意二叉树,其节点总数等于左子树节点数、右子树节点数加上根节点(即:countNodes(root->left) + countNodes(root->right) + 1)。该方法简单直接,时间复杂度为O(n),空间复杂度为O(h),其中n为节点数,h为树高。虽然针对完全二叉树的特性可能有更优解,但此递归方法适用于所有二叉树结构,具有通用性。当树为空时直接返回0作为递归终止条件。

2025-07-29 22:21:56 336

原创 559. N 叉树的最大深度

本文介绍了计算N叉树最大深度的两种方法:层序遍历和递归。层序遍历通过队列实现,统计遍历的层数即为最大深度。递归方法则计算每个节点子树的最大深度再加1。两种方法的时间复杂度均为O(n),其中n是节点数。递归代码更简洁,但层序遍历避免了递归栈的开销。根据实际需求,可以选择适合的实现方式来解决N叉树的最大深度问题。

2025-07-28 23:04:12 177

原创 572. 另一棵树的子树

摘要: 本文介绍如何判断二叉树root是否包含与subRoot结构相同的子树。通过分步解决:1) 实现isSameTree函数递归判断两棵树是否相同;2) 在isSubtree中遍历主树,检查每个节点为根的子树是否匹配目标树。代码处理了空树等边界情况,时间复杂度为O(mn),其中m和n分别为两树的节点数。若当前节点不匹配,则递归检查其左右子树。最终返回是否存在匹配的子树。

2025-07-28 23:01:38 281

原创 100. 相同的树

本文介绍了判断两棵二叉树是否相同的两种方法。第一种使用广度优先搜索(BFS),通过队列按层次比较节点值和结构;第二种采用递归方式,递归比较左右子树。关键点在于:1)处理空节点情况;2)比较节点值;3)确保子树结构相同。递归方法代码更简洁,而BFS方法更适合处理大规模树结构。两种方法时间复杂度均为O(n),空间复杂度递归为O(h),BFS为O(n)。

2025-07-28 22:58:07 295

原创 101. 对称二叉树

本文介绍了判断二叉树是否对称的两种方法:层序遍历和递归。对称二叉树要求左右子树互为镜像,即对应节点的值和结构相同。层序遍历法通过队列逐层检查节点对称性,包括处理NULL节点;递归法则定义辅助函数判断左右子树是否互为镜像。两种方法的时间复杂度均为O(n),空间复杂度均为O(n),其中递归法代码更简洁。文末提供了两种方法的C语言实现代码。

2025-07-27 20:46:59 701

原创 226. 翻转二叉树

本文介绍了二叉树翻转的BFS层序遍历实现方法。通过使用队列数据结构,逐层遍历二叉树节点,并在遍历过程中交换每个节点的左右子树。代码首先处理空树情况,然后初始化队列进行层序遍历,每次出队一个节点就交换其左右子节点,并将子节点入队继续处理。这种方法的时间复杂度为O(n),空间复杂度为O(n),其中n为节点数。文末还提到可以进一步优化代码,但未给出具体改进方案。

2025-07-27 20:10:52 217

原创 111. 二叉树的最小深度

本文介绍了一种利用BFS广度优先算法计算二叉树最小深度的方法。通过队列实现层序遍历,逐层检查各节点是否为叶子节点(无子节点),遇到第一个叶子节点时立即返回当前深度。该方法时间复杂度为O(n),空间复杂度为O(n),其中n为节点数。代码使用队列结构实现BFS,初始化深度为1,每完成一层遍历深度加1,找到叶子节点后释放内存并返回结果。该算法高效可靠,适用于各类二叉树结构的最小深度计算需求。

2025-07-27 19:59:37 202

原创 144. 二叉树的前序遍历

摘要: 本文介绍了二叉树前序遍历的两种实现方法。递归解法通过定义辅助函数preorderHelper按"根-左-右"顺序访问节点,并预先计算节点数量分配内存。改进的迭代解法使用显式栈结构模拟递归过程,通过循环处理栈顶节点并按照"右-左"顺序压栈,确保左子树优先访问。两种方法均需先计算节点数分配结果数组,迭代法避免了递归的栈开销,更适用于深度较大的树。代码含内存分配检查和释放,确保健壮性。时间复杂度均为O(n),空间复杂度递归为隐式栈深度,迭代为显式栈空间。

2025-07-24 21:24:54 227

原创 1047. 删除字符串中的所有相邻重复项

本文提出使用堆栈方法解决字符串相邻重复字符删除问题。通过遍历字符串,将字符与栈顶元素比较,相同则出栈,不同则入栈。最终栈中剩余字符即为结果。算法时间复杂度O(n),空间复杂度O(n)。改进代码优化了内存分配,使用strdup复制字符串并检查内存分配成功情况。代码示例展示了C语言实现,包括边界处理、栈操作和字符串结尾处理。这种方法高效且直观,适用于大规模字符串处理。

2025-07-24 20:42:35 342

原创 225. 用队列实现栈

摘要 本文介绍了使用两个队列实现栈的方法。栈的基本操作(push、pop、top、empty)通过队列操作来模拟。核心思路是:在弹出元素时,将主队列中除最后一个元素外的所有元素转移到辅助队列,然后取出最后一个元素作为栈顶元素,最后交换两个队列的角色。文章提供了完整的C语言实现,包括队列的创建、扩容、入队出队等操作,以及基于队列的栈操作实现。此外还提到了一种更高效的改进方案:使用单队列实现,每次入栈时将新元素置于队列前端,这样所有栈操作都能在O(1)时间复杂度内完成。

2025-07-24 20:22:22 667

原创 232. 用栈实现队列

摘要:本文介绍了如何使用两个栈实现一个队列。通过一个输入栈和一个输出栈,在需要出队操作时将输入栈元素全部转移到输出栈,从而反转元素顺序实现FIFO特性。代码提供了完整的队列实现,包括初始化、入队、出队、查看队首和判断空队列操作,时间复杂度为均摊O(1)。该方法巧妙地利用栈的LIFO特性,通过两个栈的配合实现了队列的功能。

2025-07-24 19:43:52 452

原创 459. 重复的子字符串

摘要: 本文提出了一种基于KMP算法的高效解决方案,用于判断字符串是否可由其子串重复构成。核心思路是将原字符串s与自身拼接后去掉首尾字符,若新字符串中包含s,则说明s可由子串重复构成。算法首先构建KMP所需的next数组,然后在修改后的拼接字符串中搜索s,时间复杂度为O(n)。该方法巧妙利用了字符串重复结构的特性,避免了暴力枚举所有可能的子串,显著提高了效率。

2025-07-23 22:50:57 327

原创 28. 找出字符串中第一个匹配项的下标

本文介绍了字符串匹配问题的两种解法:暴力解法和KMP算法。暴力解法通过双重循环逐个比较字符,时间复杂度O(m*n)。KMP算法利用部分匹配表(Next数组)优化匹配过程,预处理模式串后只需单次遍历主串,时间复杂度O(m+n)。文章提供了C语言实现代码,详细解释了KMP的核心思想:构建Next数组记录模式串的自匹配信息,匹配失败时利用该信息避免回溯主串。KMP算法相比暴力解法更高效,尤其适用于长字符串匹配场景。

2025-07-23 22:23:18 472

原创 541. 反转字符串 II

摘要:该问题要求按照特定规则反转字符串中的字符段。给定字符串s和整数k,每隔2k个字符反转前k个字符,剩余部分按规则处理(少于k全反,少于2k但≥k反前k个)。解决方案采用双指针法遍历字符串,在每次2k窗口内反转前k个字符,处理边界情况。时间复杂度O(n),空间复杂度O(1)。示例验证了算法的正确性,如输入"abcdefg"和k=2时输出"bacdfeg"。

2025-07-22 19:24:46 343

原创 202. 快乐数

摘要: 快乐数判定算法通过不断计算数字各位平方和,最终收敛到1则为快乐数,否则陷入无限循环。本文提出三种方法:(1)暴力解法设置循环上限;(2)哈希集合法记录出现过的数字检测循环;(3)Floyd快慢指针法(龟兔赛跑算法)高效检测循环。其中最优解法是Floyd算法,时间复杂度O(logn),空间复杂度O(1),通过快慢指针的巧妙设计,在检测循环的同时避免额外存储空间的使用。

2025-07-22 19:02:18 250

原创 350. 两个数组的交集 II

摘要: 本文介绍了求解两个数组交集的方法,要求返回结果中元素出现的次数等于两数组中出现次数的较小值。使用哈希表统计第一个数组元素出现次数,然后遍历第二个数组,将匹配元素加入结果并减少计数。代码实现采用C语言,预先分配最大可能结果数组,时间复杂度O(n+m)。同时讨论了进阶问题,如已排序数组的优化、不同数组大小的处理策略,以及内存受限时的解决方案。

2025-07-22 18:39:15 175

原创 383. 赎金信

摘要:本文解决判断ransomNote能否由magazine字符构成的问题。使用哈希表统计magazine中各字符出现次数,然后遍历ransomNote检查字符是否足够。若magazine字符不足以构建ransomNote则返回false,否则返回true。时间复杂度O(n+m),空间复杂度O(1)。关键点:字符统计与比较,确保magazine字符足够且每个字符仅用一次。

2025-07-22 18:19:55 333

原创 349. 两个数组的交集

摘要 该算法使用哈希表求解两个数组的交集。首先遍历第一个数组标记存在的元素,然后遍历第二个数组找出共同元素,标记为交集。最后收集所有交集元素返回。时间复杂度为O(n+m),空间复杂度为O(1)(利用固定大小的哈希表)。代码首先处理空输入情况,然后统计元素出现次数,动态分配内存存储结果,保证返回唯一值且不考虑顺序。

2025-07-22 18:16:29 337

原创 344. 反转字符串

摘要:本文介绍了如何原地反转字符数组的两种解法。初始解法通过判断数组长度的奇偶性,分别处理中间元素交换;改进方案采用双指针法,从数组两端向中间遍历交换元素,代码更简洁高效。两种方法均满足O(1)空间复杂度要求,但双指针解法逻辑更清晰,是更优的实现方案。文中给出了完整的C语言代码示例,展示了从原始思路到优化方案的具体实现过程。

2025-07-10 08:44:34 391

原创 242. 有效的字母异位词

摘要:本文介绍了判断两个字符串是否为字母异位词的两种解法。基础解法使用数组统计26个小写字母出现次数,时间复杂度O(n)。改进方案采用哈希表处理Unicode字符,通过链地址法解决冲突,实现更通用的解法。两种方法都先比较字符串长度,不同则直接返回false。哈希表方案虽复杂度提升但适应性更强,适合处理任意字符集。对于仅小写字母的情况,数组解法更简单高效。

2025-07-09 18:55:46 616

原创 160. 相交链表

本文介绍了两种寻找两个单链表相交起始节点的方法。第一种是暴力解法,采用双重循环固定一个指针遍历另一个链表,时间复杂度为O(m*n);第二种改进方法使用双指针,分别遍历两个链表并在到达末尾时切换链表,最终相遇点即为相交节点,时间复杂度为O(m+n)。双指针方法通过让两个指针走过相同的路径长度来消除长度差,更高效地找到相交节点。两种方法都处理了链表可能为空的情况,并保证不改变原始链表结构。

2025-07-09 18:27:36 438

原创 206. 反转链表

摘要 本文介绍了单链表反转的解决方案。通过使用三个指针(prev、curr、next)遍历链表,逐个修改节点的next指针指向来实现反转,无需额外分配内存。代码处理了空链表和单节点链表的边界情况,时间复杂度O(n),空间复杂度O(1)。改进方向包括递归实现、更简洁的指针操作等。示例展示了输入[1,2,3,4,5]将输出[5,4,3,2,1]的转换过程。

2025-07-09 17:09:38 328

原创 209. 长度最小的子数组

摘要:本文探讨了寻找数组中满足总和≥target的最短连续子数组长度的问题。首先介绍了暴力解法(双重循环枚举所有子数组),但指出其时间复杂度较高易超时。随后提出更优的滑动窗口解法:使用双指针动态调整窗口范围,维护当前窗口元素和,当满足条件时更新最小长度并移动左指针。滑动窗口解法时间复杂度为O(n),空间复杂度O(1),显著优于暴力解法的O(n²)。文章最后给出了C语言实现的滑动窗口代码示例,可高效处理大规模输入数据。

2025-07-06 15:51:57 294

原创 283. 移动零

摘要 本文提出了一种使用双指针技术原地移动数组中零元素的方法。通过维护两个指针(遍历指针和非零元素指针),算法在O(n)时间复杂度内将所有非零元素移动到数组前端,随后将剩余位置填充为零。该方法满足原地操作要求,无需额外存储空间。示例代码展示了具体实现,包括指针初始化、非零元素移动和末尾补零三个步骤。该算法高效且简洁,适用于各类编程语言实现。

2025-07-02 14:29:17 297

原创 203. 移除链表元素

本文介绍了如何删除链表中所有值等于指定val的节点。原始解法无法正确处理头节点就是要删除的情况,改进后通过引入虚拟头节点(dummy head)统一处理逻辑。关键步骤:1)创建虚拟节点指向原链表头;2)遍历链表删除匹配节点;3)返回虚拟节点后的新头。该方法能正确处理边界条件,包括空链表、删除所有节点和删除头节点等情况,时间复杂度O(n),空间复杂度O(1)。

2025-06-26 20:06:19 419

原创 141. 环形链表

本文介绍了如何判断链表是否有环的快慢指针解法。通过使用两个指针(慢指针每次一步,快指针每次两步),当二者相遇则说明存在环,否则快指针会先到达链表末尾。初始代码因边界条件判断不全面导致错误,改进后先检查指针及其next指针是否为空再移动。该方法时间复杂度O(n),空间复杂度O(1),是检测链表环的高效算法。

2025-06-26 19:31:36 334

原创 83. 删除排序链表中的重复元素

题目要求删除排序链表中重复元素,保留各值的一个节点。给定链表已排序,重复元素必定相邻。遍历链表时比较当前节点与下一节点值: 若相同,删除下一节点 若不同,移动指针 示例: 输入[1,1,2] → 输出[1,2] 输入[1,1,2,3,3] → 输出[1,2,3] 代码使用双指针法:当前指针p遍历链表,发现重复时调整指针跳过重复节点。时间复杂度O(n),空间复杂度O(1)。 关键改进: 直接修改原链表指针 仅当节点不重复时才移动指针 处理边界情况(空链表或单节点链表)

2025-06-26 19:09:45 223

原创 367. 有效的完全平方数

判断完全平方数的二分查找法 摘要 该算法使用二分查找判断一个正整数是否为完全平方数。通过将查找范围从1到num不断二分,计算中间值的平方并与num比较:若相等则返回true,否则调整查找范围。最终确定是否存在整数平方等于num,避免了直接使用sqrt函数。算法时间复杂度为O(log n),空间复杂度O(1)。 关键改进点: 使用long类型防止溢出 处理边界条件(num<1) 优化循环条件(left<=right) 每次迭代精确调整搜索范围 这个方法在231-1范围内都能高效运行,是最优的解决方

2025-06-19 20:52:07 209

原创 69. x 的平方根

摘要 该算法计算整数x的平方根整数部分,不使用内置函数。采用二分查找,在0到x范围内搜索满足k²≤x的最大整数k。设定左右边界后,通过比较中点平方与x调整搜索范围。时间复杂度O(logx),空间复杂度O(1)。关键点包括:处理边界条件、防止计算溢出(用mid ≤ x/mid替代乘法),以及记录最终有效结果。示例显示x=4返回2,x=8返回2,符合题目要求的舍去小数部分。

2025-06-19 20:42:22 270

原创 34. 在排序数组中查找元素的第一个和最后一个位置

本文介绍了在有序数组中查找目标值起始和结束位置的算法。通过两次二分查找分别确定左边界和右边界,时间复杂度为O(log n)。当找到左边界后,可以优化右边界搜索范围以减少不必要的比较。若目标值不存在,返回[-1, -1]。该算法高效且空间复杂度为O(1),适用于大规模数据。代码示例展示了完整的实现,包括边界处理和优化策略。

2025-06-19 19:54:50 416

原创 35. 搜索插入位置

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为 O(log n) 的算法。输入: nums = [1,3,5,6], target = 5输出: 2输入: nums = [1,3,5,6], target = 2输出: 1输入: nums = [1,3,5,6], target = 7输出: 4。

2025-06-18 20:28:51 254

原创 704. 二分查找

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果 target 存在返回下标,否则返回 -1。你必须编写一个具有 O(log n) 时间复杂度的算法。输入: nums = [-1,0,3,5,9,12], target = 9输出: 4解释: 9 出现在 nums 中并且下标为 4输入: nums = [-1,0,3,5,9,12], target = 2输出: -1。

2025-06-18 20:19:06 349

原创 2. 两数相加

给你两个的链表,表示两个非负的整数。它们每位数字都是按照的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

2025-06-14 11:39:26 368

原创 21. 合并两个有序链表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

2025-06-13 22:03:01 303

原创 13. 罗马数字转整数

罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。字符 数值例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II。27 写做 XXVII, 即为 XX + V + II。通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4。同样地,数字 9 表示为 IX。

2025-06-11 22:28:57 478

原创 20. 有效的括号

给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括号。示例 1:输入:s = “()”输出:true示例 2:输入:s = “()[]{}”输出:true示例 3:输入:s = “(]”输出:false示例 4:输入:s = “([])”输出:true。

2025-06-10 20:47:33 235

原创 Android学习之Activity

目录一、Activity创建步骤二、Activity在AndroidManifest中的一些属性三、设置默认启动的Activity四、Activity的生命周期五、Activity之间的跳转和数据传递5.1 显式跳转方法1方法2方法3方法45.2 隐式传递5.3 数据的传递5.4 数据的接收六、startActivityForResult:启动一个Activity,结束后返回结果七、Activity的4种启动模式standard:标准模式,默认singleTop:Task栈顶复用模式singleTask:T

2022-01-22 19:14:30 2677

原创 51单片机—中断

中断中断时为使单片机具有对外部或内部随机发生的事件实时处理而设置的,51单片机内部一共有5个中断源。引起CPU中断的根源,称为 中断源,中断源向CPU提出中断请求,CPU暂时中断原来的事务A,转去处理事件B,对事件B处理完毕后,再回到原来被中断的地方(即断点),称为 中断返回。实现上述中断功能的部件称为中断系统(中断机构)。中断也可以进行嵌套,如果单片机正在处理一个中断程序,此时,又有另一个中断现象发生,单片机将会停止当前的中断程序,而转去执行新的中断程序,新中断程序处理完毕后再回到刚才停止的中断

2021-03-09 21:56:53 3084 1

原创 JavaSE基础(已完结)

文章目录前言一、HelloWorld源程序二、类体三、标识符(与C语言类似)1、标识符的命名规则:2、标识符的命名规范:四、变量(与C语言类似)前言这个博文仅用于个人记录学习过程,学习心得,以便日后复习。本人使用的网课教程来源于Java零基础教程视频(适合Java 0基础,Java初学入门)一、HelloWorld源程序展示了Java源程序的基本结构/* 1、Java中任何有效的代码必须写到“类体”当中,最外层必须是一个类的定义。 2、public表示公开的,class表示定义一个类,H

2021-01-25 12:29:24 3173 5

空空如也

空空如也

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

TA关注的人

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