- 博客(36)
- 收藏
- 关注
原创 112.路径总和
时间复杂度:O (n),n 为树的节点数,每个节点仅遍历一次。空间复杂度:O (h),h 为树的高度。最坏情况(斜树)为 O (n),平均情况(平衡树)为 O (log n),由递归栈深度决定。
2025-11-10 21:41:02
286
原创 110. 平衡二叉树
本文探讨了如何判断二叉树是否为平衡二叉树的问题。通过后序遍历的方式,在计算节点高度的同时检查子树平衡性,采用自底向上的方法优化判断过程。算法使用辅助函数getHeight,在递归中同时计算高度并检查平衡,不平衡时返回-1提前终止。该方法的时间复杂度为O(n),空间复杂度为O(h),相比暴力解法更加高效。实现上通过返回值设计巧妙结合了高度计算和平衡判断,适用于各类二叉树的平衡性检测,特别适合深度较大的树结构。
2025-11-03 21:07:10
421
原创 108. 将有序数组转换为二叉搜索树
本文介绍了如何将升序数组转换为平衡二叉搜索树(BST)的方法。通过选择数组中间元素作为根节点,递归构建左右子树,确保左右子树节点数量均衡,从而满足平衡条件。文章详细说明了算法步骤、代码实现和复杂度分析,指出该解法时间复杂度为O(n),空间复杂度为O(logn)。关键点在于利用有序数组特性,采用二分法分割数组,递归构建平衡BST。当数组长度为偶数时,选择中间偏左或偏右元素均可。该方法既保证了平衡性,又高效利用了数组的有序特性。
2025-10-27 23:02:22
478
原创 104.二叉树的最大深度
本文介绍了计算二叉树最大深度的递归解法。核心思路是将问题分解为:当前节点的深度等于1加上左右子树深度的最大值。递归终止条件是空节点返回0。代码简洁高效,时间复杂度O(n)。文章还对比了递归和BFS两种方法的复杂度,递归的空间复杂度为O(h)。关键点在于理解二叉树的递归特性及深度计算的自底向上逻辑。
2025-10-27 23:00:15
458
原创 197.上升的温度
这篇SQL解题指南介绍了如何查询温度比前一天更高的日期ID。主要采用表自连接的方法,提供了两种实现方案:1)使用DATEDIFF函数计算日期差为1天,2)使用DATE_ADD函数匹配次日关系。两种方案性能相当,前者更简洁,后者更直观。文章还总结了表自连接技巧、日期函数用法,并建议为日期列建立索引优化性能。最后指出该方案可扩展用于查询任意N天前的温度比较。
2025-10-18 12:03:28
786
原创 196.删除重复的电子邮箱
本文介绍了两种删除重复邮箱记录并保留最小ID的SQL实现方案。方案1使用自连接,通过匹配相同邮箱并保留较小ID来删除重复项;方案2通过子查询先找出每个邮箱的最小ID,再删除不在该列表中的记录。两种方案各有优势:方案1逻辑直观,方案2在大数据量下性能更优。文章还指出MySQL语法注意事项(如子查询别名要求)和扩展修改方法(如保留最大ID)。最终根据需求选择适合方案即可高效完成数据去重。
2025-10-18 11:57:49
891
原创 183.从不订购的客户
摘要:本文讲解了如何通过SQL和Pandas找出从未下单的客户。核心思路是通过左连接Customers和Orders表,筛选出关联字段为NULL的记录(SQL使用IS NULL判断,Pandas用isna())。SQL方案推荐左连接+空值判断,性能优于NOT IN子查询;Pandas则使用merge()和布尔索引。文章强调了连接键准确性、NULL判断方法等注意事项,并指出该模式可推广到各类"存在-不存在"筛选问题,如未考试学生、未参与活动用户等场景。
2025-10-10 12:32:57
647
原创 175、组合两个表
摘要:题目要求关联Person表和Address表,输出每个人的姓名、城市和州信息,无地址则显示null。解题关键在于使用LEFT JOIN保留Person表所有记录,当Address表无匹配时字段设为null。SQL实现为:SELECT p.FirstName, p.LastName, a.City, a.State FROM Person p LEFT JOIN Address a ON p.PersonId = a.PersonId。重点在于根据需求选择合适连接方式,左连接能完美满足保留主表全部数据的
2025-10-10 12:12:00
726
原创 182.查找重复的电子邮箱
1. 核心知识点掌握GROUP BY的用法:用于按指定字段分组,将相同值的记录归为一组,是统计分组数据的基础;区分WHERE与HAVING:WHERE用于筛选行数据(分组前),HAVING用于筛选分组结果(分组后),本题需筛选分组后的统计结果,因此必须用HAVING;理解COUNT(*)的作用:统计每组的记录数,是判断数据是否重复的关键指标。2. 应用场景扩展本题的思路可迁移到其他 “筛选重复数据” 的场景,例如:。
2025-10-02 00:14:01
807
原创 181、超过经理收入的员工
摘要:本文介绍了如何通过SQL自连接解决"查找收入高于经理的员工"问题。通过Employee表的自连接(e JOIN m ON e.managerId=m.id)和条件筛选(e.salary>m.salary),可高效获取符合条件的员工姓名。该方法适用于同类层级数据比较场景,逻辑清晰且性能良好,同时自动处理了无经理员工的情况。
2025-10-02 00:04:09
742
原创 136.只出现一次的数字
摘要:本文介绍如何利用异或运算解决"找出唯一出现一次的元素"问题。关键点:异或运算具有相同数异或为0、任何数与0异或为自身、满足交换律的特性。算法只需遍历数组一次,将所有元素异或,最终结果即为唯一元素。该方案时间复杂度O(n),空间复杂度O(1),完美满足题目要求,能正确处理各种边界情况,包括单个元素、重复元素分散排列和负数等情况。
2025-09-21 10:14:49
1086
原创 125.验证回文串
本题要求判断字符串是否为回文串。解题思路是:先预处理字符串,过滤非字母数字字符并将字母转为小写,再用双指针法从首尾向中间比较字符是否对称。代码实现中,两个指针分别从左右两端移动,跳过非字母数字字符后比较对应字符,若全部相同则返回true,否则返回false。该方法时间复杂度O(n),空间复杂度O(1),高效处理大规模字符串。关键点包括:正确处理边界条件(如空字符串)、统一字符大小写、防止指针越界等。相比预处理整个字符串再反转比较的方法,双指针法更节省空间。
2025-09-21 09:51:18
457
原创 119.杨辉三角 II
本文介绍了获取杨辉三角指定行的优化解法。通过分析杨辉三角的规律,提出空间优化的原地更新方法:从后往前逐行计算,仅用一个数组存储当前行元素,将空间复杂度从O(n²)降至O(n)。代码实现中先初始化数组首元素为1,然后通过双重循环(外层遍历行、内层从后往前更新元素)构建目标行。该方法直观体现了元素间的递推关系,适合需要理解构建过程的场景。文章还对比了组合数公式法的优势,并指出杨辉三角与二项式系数的本质联系,为解决类似问题提供了思路扩展。
2025-09-13 09:24:40
297
原创 118.杨辉三角
摘要: 本文介绍了生成杨辉三角的C语言实现方法。通过动态内存分配构建二维数组,逐行计算元素值:首尾固定为1,中间元素为上一行相邻两数之和。代码使用malloc分层分配内存,并通过输出参数返回行数和每行大小,确保高效(时间复杂度O(n²))且符合C语言规范。方案兼具数学逻辑严谨性和工程实用性,适用于动态二维数组生成场景。
2025-09-13 08:56:19
819
原创 101.对称二叉树
本文介绍了如何判断二叉树是否轴对称。核心思路是通过递归比较左右子树是否镜像对称:空树或单节点树默认对称;对于非空树,需满足左右子节点值相同且左左子树与右右子树、左右子树与右左子树均对称。给出C语言实现代码,包括辅助函数和边界处理。优化方案包括迭代法替代递归、提前终止等。算法时间复杂度和空间复杂度均为O(n),适用于任意二叉树对称性判断。文末指出该解法可扩展为判断两棵任意树是否镜像对称。
2025-08-25 07:57:03
386
原创 100. 相同的树
本文介绍了判断两棵二叉树是否相同的算法。通过同步遍历两棵树并比较对应节点的结构和值,使用递归方法实现:当两节点都为空时返回true;若一个为空或节点值不同则返回false;否则递归比较左右子树。代码简洁高效,时间复杂度O(n),空间复杂度O(h)。该算法适用于需要严格比较二叉树相同性的场景,并可通过修改比较逻辑扩展为判断镜像对称树。
2025-08-25 07:52:12
436
原创 94. 二叉树的中序遍历
本文介绍了二叉树中序遍历的递归实现方法。通过定义辅助函数计算节点数确定数组大小,再使用递归按"左-根-右"顺序填充数组。算法逻辑清晰,内存管理规范,适合小型二叉树。文章详细解析了递归逻辑、指针传递和内存分配等关键技术点,并指出递归方式的局限性(可能栈溢出)和适用场景。最后提到该方法可扩展实现前序和后序遍历,只需调整节点访问顺序。整体提供了二叉树遍历的完整递归解决方案。
2025-08-18 11:17:04
874
原创 JavaScript 中constructor 属性的指向异常问题
本文深入分析了JavaScript中constructor属性指向异常的成因与解决方法。当通过对象字面量覆盖原型对象时,constructor属性会错误指向Object构造函数而非原构造函数。主要原因在于新原型对象没有保留原构造函数的关联。解决方法是在覆盖原型时显式设置constructor属性。维持正确指向对类型识别、动态实例创建等场景至关重要。建议在批量定义原型方法时手动指定constructor,而增量添加方法则无需额外处理。理解这一机制有助于提升JavaScript面向对象编程的实践能力。
2025-08-17 18:43:52
836
原创 88. 合并两个有序数组
本文介绍了一种高效合并两个非递减有序数组的方法。通过双指针逆向填充技术,利用nums1数组末尾预留空间,从后往前比较元素并填充,避免覆盖未处理元素。该方法时间复杂度O(m+n),空间复杂度O(1),无需额外存储空间。核心步骤包括:初始化三个指针分别指向数组末尾;逆向比较填充较大元素;处理剩余元素。适用于需要原地合并有序数组的场景,并可扩展应用于链表合并等问题。示例展示了将[1,2,3]和[2,5,6]合并为[1,2,2,3,5,6]的具体过程。
2025-08-13 12:06:01
810
原创 JavaScript 自动分号插入(ASI)
JavaScript自动分号插入(ASI)机制详解:本文系统解析了JavaScript引擎自动插入分号的三大规则(语句终止处、换行分隔边界、限制符强制终止),并指出必须手动添加分号的5类关键场景(下一行以(、[、运算符开头,同一行多个表达式,模板字符串前)。虽然ASI提供了编码便利,但为避免潜在错误,建议养成显式添加分号的习惯,尤其注意特殊开头的行前加分隔符,以确保代码健壮性和可维护性。
2025-08-13 10:12:29
972
原创 js中的this指向
JavaScript中的this关键字指向动态变化,取决于调用方式而非定义位置:1)全局作用域中非严格模式指向window,严格模式为undefined;2)函数独立调用时非严格模式指向全局对象,严格模式为undefined;3)对象方法中指向调用对象;4)构造函数中指向新实例;5)事件处理函数中指向触发元素;6)箭头函数继承外层this且不可修改。此外,call/apply/bind可显式修改this指向,区别在于参数传递方式和执行时机。理解this规则对JavaScript开发至关重要。
2025-08-12 09:38:45
1029
原创 83.删除排序链表中的重复元素
本文介绍了一种删除有序链表中重复元素的算法。利用链表已排序的特性(重复元素必连续出现),通过单指针遍历链表,比较当前节点与下一节点的值。若相同则调整指针跳过重复节点并释放内存,否则继续后移指针。该算法时间复杂度O(n),空间复杂度O(1),高效处理了边界情况,体现了利用有序性优化问题解决的思想。
2025-08-10 18:15:19
419
原创 70.爬楼梯
摘要:本文介绍了一个经典的爬楼梯问题,每次可以爬1或2个台阶,计算到达n阶楼梯的方法数。通过分析发现该问题符合斐波那契数列规律,即f(n)=f(n-1)+f(n-2)。采用动态规划方法,使用三个变量迭代计算,时间复杂度O(n),空间复杂度O(1)。该解法高效解决了1≤n≤45范围内的爬楼梯问题,体现了将复杂问题转化为简单递推关系的解题思路。
2025-08-10 17:42:04
341
原创 69.计算x的平方根
题目要求计算非负整数x的算术平方根的整数部分,不能使用内置函数。核心思路是通过二分查找在[0,x]范围内找到最大的整数n,使得n²≤x。具体步骤包括:初始化边界、二分查找循环(比较中间值的平方与x)、更新边界直至找到结果。优化方法包括缩小初始范围(x>4时右边界设为x/2)、使用牛顿迭代法(n=(n+x/n)/2)加速收敛。两种方法的时间复杂度分别为O(logx)和O(loglogx),需注意处理整数溢出问题。二分查找简单稳定,牛顿法收敛更快,可根据实际需求选择。
2025-08-04 08:18:51
927
原创 67.二进制求和
该题要求实现两个二进制字符串的求和运算。解题思路采用模拟手动二进制加法的方式,从最低位开始逐位相加并处理进位。代码实现中,通过指针从字符串末尾遍历,计算当前位和进位,并将结果存入预先分配的内存中。该方法高效处理了不同长度字符串、边界情况和进位问题,时间复杂度O(n),空间复杂度O(n)。该方案不仅解决了二进制求和问题,还为处理字符串形式的大数运算提供了通用思路,体现了将复杂运算转化为直观步骤的算法设计思想。
2025-08-04 08:00:12
1071
原创 66.加一
本题主要考察对数字加法运算中进位问题的处理能力,核心是模拟手动加法的过程,重点关注连续进位及数组长度可能扩展的特殊情况。核心逻辑提炼:通过从数组末尾(数字的最低位)开始遍历,逐位处理加 1 操作。若当前位小于 9,直接加 1 即可完成计算;若当前位为 9,则加 1 后会产生进位,需将该位置为 0 并继续向前一位处理。这种处理方式能高效应对大多数情况,避免不必要的全数组遍历。特殊情况处理。
2025-07-28 01:12:55
635
原创 58、最后一个单词的长度
在解决 “最后一个单词的长度” 问题时,核心目标是快速计算字符串中最后一个单词的长度,需处理单词前后的空格,追求高效的时间和空间复杂度。通过分析可知,从字符串末尾逆向遍历是最优选择。核心思路是先跳过末尾空格找到单词结束位置,再向前统计非空格字符数量,即为最后一个单词长度。遍历中,遇空格且未计数则继续向前,遇非空格则开始计数,已计数时遇空格则终止并返回结果。关键细节是逆向遍历无需关注前部内容,聚焦最后一个单词边界,遍历终止时统计结果即为目标。对全空格或空字符串,通过边界检查返回 0,确保逻辑完整。
2025-07-28 00:48:26
864
原创 28. 找出字符串中第一个匹配项的下标
摘要:本文探讨了在字符串haystack中查找子串needle首次出现位置的两种方法。标准库方案直接调用strstr函数,通过指针运算获取下标;暴力匹配则手动实现双层循环进行字符比较。两种方案的时间复杂度均为O(n*m),适用于不同场景:标准库简洁高效,暴力匹配更直观且不依赖库函数。文章还分析了指针运算、循环终止条件等关键点,并建议针对长字符串可进一步优化为KMP等高效算法。最终方案选择需权衡代码简洁性与底层控制需求。
2025-07-20 22:05:43
1063
原创 35.搜索插入位置
本文介绍了使用二分查找在有序无重复数组中查找目标值或确定其插入位置的方法。通过初始化左右指针并不断缩小搜索范围,当目标值存在时直接返回其索引;若不存在,则循环终止时左指针所指即为插入位置。该方法严格遵循二分查找逻辑,实现了O(logn)的时间复杂度要求。文中通过具体示例验证了算法的正确性,并提供了简洁高效的代码实现,适用于需要快速定位元素或确定插入位置的场景。
2025-07-20 20:59:35
629
原创 27.移除元素
指针分工的高效性:快慢指针通过 “一前一后” 遍历,精准分离有效元素与目标值;首尾指针则以 “两端对进” 模式,利用元素覆盖减少移动次数,两种策略均以线性时间完成操作,体现 “指针协作替代暴力遍历” 的优化思想。场景适配的灵活性:传统方法普适性强,适用于各类元素分布;优化方法针对目标值较少的场景定向加速,揭示算法设计需结合数据特征 “量体裁衣”,避免盲目追求通用解。问题建模的简洁性。
2025-06-02 11:52:51
1094
原创 26.删除有序数组中的重复项
一、题目给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致。然后返回 nums 中唯一元素的个数。考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。返回 k。
2025-06-02 10:59:24
437
原创 21.合并两个有序链表
算法优势:迭代方法通过虚拟头节点巧妙地规避了边界条件的判断,使代码逻辑更为清晰。递归法通过递归调用简化代码结构,可读性高。复杂度情况:两种方法时间复杂度均为 O(n+m)(n、m 为链表长度),但迭代法空间复杂度为 O(1),递归法因调用栈深度为 O(n+m),存在栈溢出风险。适用场景:迭代法适用于对空间要求较高的场景(如数据库索引合并、归并排序);递归法适用于链表长度可控、追求代码简洁的场景。实际应用中需根据链表长度与性能需求权衡选择。
2025-05-25 18:54:07
364
原创 5.有效的括号
这段代码定义了一个判断字符串中括号是否有效的函数 isValid,其核心逻辑是利用栈结构处理括号匹配问题。函数通过遍历字符串,遇到左括号(`(`、`{`、`[`)时将对应的右括号(`)`、`}`、`]`)压入栈(用指针top 和原字符串s模拟栈),遇到右括号时检查栈顶元素是否匹配:若栈为空或不匹配则返回 false,匹配则弹出栈顶元素。遍历结束后,若栈为空则所有括号正确匹配,返回 true,否则返回 false。但该算法会修改原字符串内容,适用于需高效验证括号嵌套顺序的场景。
2025-05-24 16:58:57
511
原创 4.最长公共前缀
通过以第一个字符串为基准,逐位比较所有字符串的相同位置字符,遇到不匹配或某字符串长度不足时立即截断基准字符串(插入`'\0'`),无需额外空间;时间复杂度O(m×n),空间复杂度O(1),逻辑简洁且能提前终止,但当首个字符串较长时可能导致冗余比较,适用于小规模数据或公共前缀较短的场景。
2025-05-18 14:25:43
341
原创 3.罗马数字转整数
通过解决 “罗马数字转整数” 问题,掌握了将实际规则抽象为算法逻辑的方法,学会利用逆向遍历简化判断,避免复杂的状态记录;实践了和数组映射的字符数值转换技巧,理解函数封装与防御性编程的重要性;同时,能够从减少重复计算、优化映射方式等角度分析代码复杂度并进行性能优化,总结出从规则梳理、示例验证到代码实现的通用解题流程,提升了算法设计与问题解决能力。
2025-05-18 13:39:01
999
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅