- 博客(54)
- 收藏
- 关注
原创 043验证二叉搜索树
这篇题解探讨了验证二叉搜索树的两种方法。第一种递归方法通过维护每个节点的取值范围来判断,时间复杂度O(n),空间复杂度O(n)。第二种方法利用中序遍历特性,检查遍历结果是否为升序序列,同样具有O(n)的时间复杂度。两种方法都利用了二叉搜索树的关键性质:节点值的范围约束和中序遍历的有序性。题解详细分析了两种方法的实现思路和复杂度,并提供了Java代码实现,帮助理解如何高效验证二叉搜索树的有效性。
2026-05-15 08:33:26
20
原创 042将有序数组转换为二叉搜索树
本文讨论了将有序数组转换为平衡二叉搜索树的问题。通过递归方法,每次选取数组中间元素作为根节点,确保左右子树高度差不超过1。作者提供了自己的实现方案,时间复杂度O(n),空间复杂度O(logn)。官方题解补充了三种变体:选择中间偏左、偏右或随机位置的元素作为根节点,这些方法都会产生不同结构但都符合要求的平衡树。关键在于理解二叉搜索树的中序遍历即为升序序列,通过中间分割策略可保证树的平衡性。
2026-05-15 08:31:32
21
原创 041二叉树的层序遍历
二叉树层序遍历题解摘要 本题要求实现二叉树的层序遍历,采用广度优先搜索(BFS)算法。解题思路是利用队列存储节点,首先将根节点入队,然后循环处理队列中的节点:每次处理当前层的所有节点(通过队列大小确定),将这些节点的值存入结果列表,同时将它们的左右子节点按顺序入队。时间复杂度为O(n),空间复杂度为O(n),其中n为节点总数。该解法与官方题解一致,通过队列实现了高效的层次遍历。
2026-05-15 08:29:28
3
原创 040二叉树的直径
摘要 本文讨论了如何计算二叉树的直径(最长路径长度)。解题思路是通过递归计算每个节点的左右子树最大深度,并维护经过该节点的最长路径(L+R)。最终取所有节点中的最大值即为二叉树的直径。时间复杂度为O(n),空间复杂度为O(Height)。关键点在于认识到最长路径不一定经过根节点,但可以通过比较每个节点的左右子树深度来找到全局最大值。
2026-05-15 08:27:37
11
原创 039对称二叉树
本文介绍了判断对称二叉树的两种方法:递归和迭代。递归方法通过比较对称位置的节点值和子树是否对称;迭代方法使用队列,将对称位置的节点成对入队进行比较。官方题解优化了迭代方法,通过将根节点入队两次简化边界条件处理,并利用队列允许null值的特性减少条件判断。两种方法的时间复杂度均为O(n),空间复杂度为O(n)。递归方法代码简洁,迭代方法避免了递归的栈开销,各有优势。
2026-05-15 08:26:01
9
原创 038翻转二叉树
本文介绍了翻转二叉树的两种递归解法。第一种解法先交换左右子树,再递归处理子树;第二种解法先递归处理子树,再交换左右子树。两种方法的时间复杂度均为O(n),空间复杂度在最坏情况下为O(n),平均情况下为O(logn)。该问题本质上是二叉树的深度优先搜索应用,通过递归可以简洁地实现树结构的翻转操作。两种解法思路相似,区别仅在于交换节点和递归调用的顺序不同。
2026-05-13 20:41:46
21
1
原创 037二叉树的最大深度
本文介绍了计算二叉树最大深度的两种方法。深度优先搜索(DFS)采用递归方式,时间复杂度O(n),空间复杂度O(height);广度优先搜索(BFS)使用队列逐层遍历,时空复杂度均为O(n)。两种方法都能有效求解,DFS代码简洁但递归有栈溢出风险,BFS适合处理大规模数据但需要额外空间。根据实际场景选择合适方法即可。
2026-05-13 10:10:09
123
原创 036二叉树的中序遍历
本文介绍了二叉树中序遍历的三种实现方法:递归法、迭代法和Morris遍历法。递归法采用“左根右”顺序遍历,时间复杂度O(n),空间复杂度O(n)。迭代法使用栈模拟递归过程,空间复杂度仍为O(n)。Morris遍历法通过修改树结构实现遍历,空间复杂度优化至O(1),但实现较复杂。三种方法各有特点,其中Morris遍历在空间效率上最优,但理解和实现难度较大。建议通过多次练习掌握Morris遍历的核心思想:利用前驱节点的右指针标记遍历状态,实现无栈遍历。
2026-05-13 10:07:04
271
原创 035LRU缓存
本文实现了一个LRU缓存机制,采用哈希表+双向链表的数据结构。哈希表存储键与链表节点的映射,双向链表维护访问顺序:最近使用的节点靠近头部,最久未使用的靠近尾部。主要操作包括:get时若存在则移动节点至头部并返回值;put时若存在则更新值并移动至头部,否则创建新节点插入头部,若容量超限则删除尾部节点。所有操作时间复杂度均为O(1),空间复杂度为O(capacity)。该实现模拟了Java的LinkedHashMap,通过哈希表快速定位节点,双向链表维护访问顺序,实现了高效的LRU缓存功能。
2026-05-13 10:03:41
192
原创 034合并K个升序链表
本文讨论了合并K个升序链表的三种解法:1)顺序合并法,时间复杂度O(kn²),空间O(1);2)分治合并法,时间复杂度O(knlogk),空间O(1),采用自底向上两两合并;3)优先队列法,时间复杂度O(knlogk),空间O(k),利用最小堆每次取出最小节点。三种方法的核心都是基于两个有序链表的合并操作,其中分治法和优先队列法通过不同优化策略降低了时间复杂度。
2026-05-13 10:02:07
30
原创 MySQL-进阶篇-SQL优化
SQL优化技巧摘要:插入优化:批量插入、手动事务提交、主键顺序插入可提升性能;大批量数据使用load指令导入更高效。主键优化:InnoDB采用索引组织表结构,顺序插入避免页分裂,删除数据可能触发页合并。建议使用短自增主键,避免修改主键。排序优化:建立合适索引并使用覆盖索引可避免filesort,注意多字段排序时的ASC/DESC规则,可调整sort_buffer_size参数。分组优化:通过索引可避免临时表产生,提升group by性能。
2026-05-12 12:36:59
571
原创 033排序链表
本文讨论了链表排序的两种解法。初始解法使用ArrayList存储节点后排序,时间复杂度O(nlogn)但空间复杂度O(n)。更优解法采用归并排序:1)自顶向下递归实现,空间复杂度O(logn);2)自底向上迭代实现,通过分组合并实现O(1)空间复杂度。后者通过控制子链表长度逐步扩大有序区间,最终完成整体排序,是满足题目要求的最佳解法。两种归并排序都保持了O(nlogn)时间复杂度,但迭代方式更节省空间。
2026-05-12 08:59:08
37
原创 032随机链表的复制
本文探讨了随机链表的复制问题,提出了两种解决方案。第一种方法使用哈希表存储新旧节点的映射关系,通过两次遍历完成复制,时间复杂度O(n),空间复杂度O(n)。第二种方法采用迭代和节点拆分技术,通过三次遍历实现复制,时间复杂度O(n),空间复杂度优化为O(1)。两种方法都能正确处理随机指针的复制,其中第二种方法通过将拷贝节点插入原节点后的方式,避免了额外空间的使用。文章对比分析了两种方法的实现思路和优缺点,为处理类似链表复制问题提供了参考方案。
2026-05-12 08:57:30
160
原创 031K个一组翻转链表
本文介绍了K个一组翻转链表的解法。通过使用哑节点(dummy)简化边界处理,将链表分为若干组进行翻转。每组翻转时,先定位该组的头节点(head)和尾节点(tail),然后调用myReverse方法进行局部翻转,返回新的头尾节点。最后将翻转后的子链表与前后节点重新连接。时间复杂度O(n),空间复杂度O(1)。关键在于正确处理每组翻转后的连接关系,以及使用哨兵节点简化操作。
2026-05-12 08:56:26
234
原创 MySQL-进阶篇-索引
MySQL索引是提高查询效率的数据结构,主要分为聚集索引和二级索引。索引结构包括二叉树、红黑树、B-Tree和B+Tree等,其中InnoDB采用优化后的B+Tree结构,通过增加叶子节点间的指针提高区间查询性能。索引具有提高检索速度的优点,但会增加存储空间和维护成本。创建索引使用CREATE INDEX语法,支持单列和联合索引。聚集索引优先使用主键,若无则选择唯一索引或自动生成rowid。二级索引通过回表查询获取完整数据。B+Tree的高度决定了其存储能力,3层结构可支持千万级数据存储。
2026-05-11 16:23:36
1471
原创 MySQL-进阶篇-存储引擎
MySQL存储引擎是数据库核心组件,负责数据存储和检索。主要包含四层体系结构:连接层处理客户端连接,服务层执行SQL解析优化,引擎层实现数据存取(索引在此层实现),存储层负责文件交互。InnoDB是默认引擎,支持事务、行锁和外键,每表对应.ibd文件;MyISAM适合读多写少场景,分为.MYD(数据)、.MYI(索引)和.sdi(结构)文件;Memory引擎数据存于内存,适用于临时表。选择引擎需考虑事务需求(InnoDB)、读写比例(MyISAM)或缓存场景(Memory)。
2026-05-11 16:14:42
357
原创 030两两交换链表中的节点
本文介绍了链表节点两两交换的两种解法。递归法通过递归处理每组节点,返回交换后的新头节点;迭代法使用哑节点和前置指针定位每组节点进行交换。两种方法时间复杂度均为O(n),递归空间复杂度O(n),迭代O(1)。解题关键在于正确处理节点指针关系,递归简洁但占用栈空间,迭代更高效但实现稍复杂。两种方法各有优劣,可根据实际情况选择。
2026-05-11 08:57:10
35
原创 029删除链表的倒数第N个结点
本文总结了删除链表倒数第N个节点的三种解法:1)计算链表长度法,通过两次遍历定位删除节点;2)哈希表法,存储节点序号映射;3)双指针法,保持指针间距同步移动。关键点在于处理边界条件(删除头节点),可通过添加哑节点简化逻辑。三种方法时间复杂度均为O(L),空间复杂度从O(1)到O(L)不等。最优解法是双指针法,既高效又节省空间。
2026-05-11 08:56:09
195
原创 028两数相加
本文介绍了LeetCode上"两数相加"问题的两种解法。第一种解法使用三个循环分别处理两个链表和进位情况,时间复杂度O(max(m,n)),空间复杂度O(1)。第二种官方解法优化为一个循环,利用三目运算符处理链表长度不等的情况,同样保持线性时间复杂度和常数空间复杂度。两种方法都采用模拟加法过程,通过取余和整除运算处理进位。关键区别在于官方解法通过条件判断简化了代码结构,避免了重复循环。该问题考察链表操作和进位处理的编程能力,重点在于掌握加法运算的模拟方法和代码优化技巧。
2026-05-11 08:54:46
33
原创 027合并两个有序链表
本文介绍了合并两个有序链表的两种解法。迭代法通过比较两个链表当前节点值,将较小节点连接到新链表,时间复杂度O(n),空间复杂度O(1)。递归法则通过递归调用比较节点值,时间复杂度O(n)但空间复杂度较高。两种方法都实现了有序链表的合并,迭代法更节省空间,而递归法代码更简洁。解题关键在于正确处理链表节点的比较和连接顺序。
2026-05-10 09:04:49
162
原创 026环形链表II
本文分析了环形链表检测问题,介绍了两种解法:哈希表法和快慢指针法。哈希表法通过记录访问过的节点判断环的存在,时间复杂度O(n),空间复杂度O(n)。重点讲解了Floyd判圈算法(龟兔赛跑算法),通过数学推导证明当快慢指针相遇时,从相遇点到环入口的距离等于链表头到环入口的距离。该算法时间复杂度O(n),空间复杂度O(1),是更优解。关键点在于理解快慢指针移动步数与环位置之间的数学关系。
2026-05-10 09:03:34
199
原创 MySQL-基础篇-事务
事务是数据库操作的基本单元,具有ACID四大特性:原子性(不可分割)、一致性(数据状态一致)、隔离性(独立运行)和持久性(永久生效)。MySQL默认自动提交事务,可通过设置@@autocommit参数切换手动提交模式。事务操作支持两种方式:直接控制提交/回滚,或通过START TRANSACTION显式开启事务。并发事务可能引发脏读、不可重复读和幻读问题,通过设置不同隔离级别(READ UNCOMMITTED至SERIALIZABLE)来解决,级别越高安全性越好但性能越低。
2026-05-10 09:01:37
58
原创 MySQL-基础篇-多表查询
本文系统介绍了数据库多表查询的核心概念与技术。主要内容包括:1)三种多表关系(一对多、多对多、一对一)的实现方式;2)多表查询分类(连接查询和子查询),其中连接查询细分为内连接、外连接和自连接;3)子查询的四种类型(标量、列、行、表子查询)及其应用场景;4)联合查询的语法与注意事项。文章通过具体案例和SQL语法示例,详细阐述了各类查询的实现方法,为数据库表结构设计和复杂查询提供了实用指导。
2026-05-10 08:58:28
453
原创 MySQL-基础篇-约束
数据库约束是作用于表字段的规则,用于确保数据的正确性、有效性和完整性。主要约束类型包括主键、外键、唯一、非空等。外键约束用于建立表间关联,保证数据一致性,可通过CREATE TABLE或ALTER TABLE添加。外键支持多种删除/更新行为(如CASCADE、SET NULL等),通过ON UPDATE/DELETE子句设置。MySQL中主键自增使用AUTO_INCREMENT,检查约束条件用&&连接。
2026-05-10 08:55:56
43
原创 MySQL-基础篇-函数
本文介绍了MySQL中常用的四种函数类型:字符串函数、数值函数、日期函数和流程函数。字符串函数包括CONCAT、LOWER等,使用时需注意SUBSTRING索引从1开始。数值函数提供CEIL、MOD等数学运算功能。日期函数如CURDATE、DATE_ADD等用于日期处理。流程函数如IF、CASE WHEN等可实现SQL条件筛选,提高查询效率。这些内置函数能简化数据库操作,增强SQL语句的功能性。
2026-05-09 21:07:18
43
原创 MySQL-基础篇-SQL
本文总结了MySQL基础SQL语法,主要包括:SQL通用语法规则(书写格式、大小写、注释等)SQL分类(DDL、DML、DQL等)DDL数据库和表操作(创建/查询/修改/删除)DML数据操作(增删改)DQL数据查询(基本查询、条件查询、聚合函数、分组查询)数据类型(数值、字符串、日期时间类型)重点介绍了各类SQL语句的标准语法格式和使用注意事项,适合作为MySQL基础操作的快速参考手册。
2026-05-09 21:02:52
632
原创 MySQL-基础篇-MySQL概述
本文介绍了MySQL数据库的基本操作与概念,包括下载地址、启动/停止服务命令(net start/stop mysql80)以及客户端连接方式(mysql -uroot -p)。同时阐述了关系型数据库(RDBMS)的特点:基于关系模型,由相互关联的二维表组成,采用统一格式存储数据,支持标准SQL语言操作,便于维护和使用。文中还提示了配置PATH环境变量的注意事项。
2026-05-09 20:50:26
49
原创 025环形链表
本文讨论了检测链表是否存在环的两种方法。第一种是哈希表法,通过存储访问过的节点来判断是否重复访问,时间复杂度O(n),空间复杂度O(n)。第二种是快慢指针法(Floyd判圈算法),快指针每次走两步,慢指针每次走一步,若存在环则两者终会相遇,时间复杂度O(n),空间复杂度O(1)。作者最初实现的快慢指针解法与官方题解思路一致,主要区别在于循环条件的处理方式。该算法利用了快慢指针在环中移动时距离逐步缩短的特性,是检测环存在的高效方法。
2026-05-09 09:57:39
305
原创 024回文链表
本文讨论了判断链表是否为回文链表的三种解法。第一种方法将链表值复制到数组后用双指针判断;第二种采用递归方式,从链表尾部开始比较;第三种是快慢指针法,通过找到链表中间节点并反转后半部分进行比较。其中快慢指针法最优,时间复杂度O(n),空间复杂度O(1)。该方法先找到中间节点,反转后半部分链表,比较前后两部分节点值,最后还原链表结构。相比其他方法,快慢指针法既高效又节省空间,同时保持了代码的模块化和可读性。
2026-05-09 09:56:27
279
原创 023反转链表
这篇题解讨论了反转链表的三种方法:迭代法、递归法和栈法。迭代法通过三个指针实现,时间复杂度O(n),空间复杂度O(1);递归法利用函数调用栈,时间空间复杂度均为O(n);栈法借助显式栈结构,同样达到O(n)的时间空间复杂度。三种方法各有特点,迭代法空间最优,递归法代码简洁,栈法则直观易懂。关键在于理解指针操作和正确处理边界条件,特别是避免形成环状结构。
2026-05-08 09:06:19
291
原创 022相交链表
本文讨论了LeetCode上相交链表问题的两种解法。第一种解法使用哈希集合存储链表A的节点,然后遍历链表B查找相交节点,时间复杂度O(m+n),空间复杂度O(m)。第二种更优解法采用双指针技巧,通过让指针分别遍历两个链表来消除长度差,最终在相交节点相遇。该方法时间复杂度仍为O(m+n),但空间复杂度优化至O(1)。文章详细分析了双指针解法的核心思路,即通过指针交换遍历路径来同步移动,最终找到相交点或确定无交点。两种解法的代码实现均被完整展示。
2026-05-08 09:04:59
196
原创 021搜索二维矩阵II
本文讨论了在有序二维矩阵中搜索目标值的三种方法。暴力解法时间复杂度为O(mn),按行二分查找优化至O(mlogn),最优解法是Z字形查找法,时间复杂度仅为O(m+n)。Z字形查找从矩阵右上角开始,根据当前元素与目标值的大小关系动态调整搜索范围:若当前值小于目标则下移行,大于目标则左移列。这种方法充分利用了矩阵行列有序的特性,实现了高效搜索。
2026-05-07 08:59:45
243
原创 020旋转图像
本文探讨了旋转二维矩阵90度的三种方法。方法一使用辅助数组,通过观察发现旋转后第i行变为倒数第i列,时间复杂度O(n²),空间复杂度O(n²)。方法二原地旋转,通过确定每组4个元素的坐标关系进行交换,时间复杂度O(n²),空间复杂度O(1)。方法三通过水平翻转加主对角线翻转实现旋转,同样具有O(n²)时间复杂度和O(1)空间复杂度。三种方法都基于关键坐标变换公式matrix[row][col] = matrix[col][n-1-row],其中方法三逻辑最清晰且通用性最强。
2026-05-07 08:58:17
157
原创 019螺旋矩阵
本文讨论了螺旋矩阵问题的两种解法。第一种解法通过维护上下左右边界来模拟螺旋遍历过程,时间复杂度O(mn),空间复杂度O(1)。第二种解法使用方向数组和访问标记数组来模拟移动方向,时间复杂度O(mn),空间复杂度O(mn)。两种方法都实现了矩阵元素的螺旋顺序遍历,但第二种方法在边界条件处理上更为精细。关键点在于正确维护遍历边界和方向变化的条件,避免重复访问元素。
2026-05-06 09:00:04
205
原创 018矩阵置零
本文探讨了矩阵置零问题的三种解法。初始解法使用HashSet记录需要置零的行列,空间复杂度为O(m+n)。官方解法一改用boolean数组标记,保持相同复杂度但更高效。解法二创新性地利用矩阵第一行和第一列作为标记空间,结合两个标记变量处理首行首列,将空间复杂度降至O(1)。解法三进一步优化,仅使用一个标记变量处理首列,通过倒序更新避免覆盖标记。三种方法时间复杂度均为O(m*n),但空间复杂度从O(m+n)逐步优化到O(1),体现了逐步优化的算法设计思路,特别是利用矩阵自身空间存储标记的巧妙方法。
2026-05-06 08:58:47
191
原创 017缺失的第一个正数
这篇题解探讨了如何在O(n)时间复杂度和O(1)空间复杂度下找到数组中缺失的最小正整数。提出了两种方法:哈希表标记法和置换法。哈希表法通过将数组元素转化为负数来标记存在性,置换法则通过元素交换将其归位到正确位置。两种方法的核心思想都是利用数组本身作为存储空间,避免额外空间开销。最终通过遍历数组找出第一个不符合条件的位置,确定缺失的最小正整数。对于完全连续的数组,缺失值即为n+1。该解法巧妙地利用了数组索引与元素值的关系,实现了高效的空间利用。
2026-05-05 09:28:21
373
原创 016除了自身以外数组的乘积
本文讨论了LeetCode上"除了自身以外数组的乘积"问题的两种解法。初始解法使用前缀和后缀乘积数组,时间复杂度O(n),空间复杂度O(n)。优化后的解法巧妙利用输出数组存储后缀乘积,同时用变量维护前缀乘积,将空间复杂度降至O(1)。两种方法都保持了O(n)的时间复杂度,但后者在不使用额外空间的情况下完成了计算,展示了如何通过复用已有数据结构来优化空间效率。这道题的关键在于理解乘积计算的前后依赖关系,并通过迭代方式高效地组合这些部分结果。
2026-05-05 09:27:17
158
原创 015轮转数组
本文分析了轮转数组问题的三种解法:额外数组法:时间复杂度O(n),空间复杂度O(n)。通过新建数组计算元素最终位置,简单直观但空间效率不高。环状替换法:时间复杂度O(n),空间复杂度O(1)。通过计算最大公约数确定遍历圈数,实现原地替换。难点在于分析遍历所有元素所需的圈数。数组翻转法:时间复杂度O(n),空间复杂度O(1)。通过三次翻转操作实现轮转:先整体翻转,再分别翻转前后两部分。关键在于观察轮转前后数组元素位置关系的变化。方法二和方法三在空间效率上更优,更能体现算法思维能力,适合面试场景。
2026-05-04 14:56:46
698
原创 014合并区间
本文讨论了合并重叠区间的算法问题。解题关键在于先将区间按左端点排序,这样重叠区间会连续排列。算法首先检查区间数组是否为空,然后排序处理。通过遍历排序后的区间,逐个判断是否与前一个区间重叠:若不重叠则直接加入结果列表,若重叠则合并右端点。最终时间复杂度为O(nlogn),主要来自排序步骤;空间复杂度为O(logn)。该解法巧妙地利用了排序后重叠区间的连续性特点,简化了合并判断过程。核心思路展示了如何通过预处理数据来简化复杂问题的解决方法。
2026-05-04 14:55:10
153
原创 013最大子数组和
本文分析了求解最大子数组和问题的三种方法:动态规划、分治和前缀和。动态规划通过状态转移方程高效求解,时间复杂度O(n),空间复杂度O(1);分治法采用递归思路,时间复杂度O(n)但空间复杂度较高;前缀和法通过维护最小前缀和快速计算,时间复杂度O(n)。三种方法各有特点,其中动态规划最为简洁高效,分治法扩展性较强可用于区间查询问题,前缀和法则思路巧妙。理解这些方法有助于掌握不同算法思想在实际问题中的应用。
2026-05-03 12:12:51
427
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅