自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 算法笔记19 - 图和通用结构 | 图的两种遍历 | 三种拓扑排序 | 两种最小生成树算法Kruskal, Prim | 最短路径算法Dijkstra

本文提出了一种通用的图结构设计方案,包含节点(Node)、边(Edge)和图(Graph)三个核心类,能够将不同输入格式的图统一转换为标准结构。基于该结构实现了两种图遍历算法:BFS采用"进队时标记"策略避免重复访问,DFS通过"curr回压+break"技巧模拟递归调用栈。此外还介绍了三种拓扑排序方法,重点分析了基于入度的Kahn算法(BFS思想),通过维护入度表和零入度队列实现。这种"通用结构+标准算法"的设计模式可以有效降低不同图算法题目间的

2025-12-16 10:48:30 824

原创 算法笔记18 - 并查集及其两种实现 | 朋友圈问题or省数量问题 | 岛问题1 | 岛问题2

本文介绍了并查集(DSU)的两种高效实现方案及其应用。针对非数字类型数据,提出了基于HashMap的泛型实现,采用路径压缩和按秩合并优化;对于连续整数数据,设计了基于数组的高性能方案,通过手动模拟栈降低开销。最后以朋友圈问题为例,展示了并查集在连通分量统计中的实际应用,通过对称遍历邻接矩阵和动态维护集合数量实现高效求解。两种实现各具优势,可根据数据类型和性能需求灵活选择。

2025-11-23 20:09:59 725

原创 算法笔记17 - 贪心算法介绍与思路 | 路灯摆放问题 | 活动安排问题 | 最低字典序拼接 | 金条分割问题 | 项目投资问题

贪心算法实战摘要 贪心算法是一种局部最优决策策略,通过每一步选择当前最优解来寻求全局最优。本文通过两个经典案例说明其应用: 会议室安排问题 - 优先选择结束早的项目,以最大化场次。实现使用小根堆按结束时间排序,验证采用暴力全排列法对数器测试。 字典序拼接问题 - 通过自定义比较器(o1+o2与o2+o1比较)确定字符串排序规则,确保拼接结果字典序最小。同样通过暴力递归生成全排列验证策略正确性。 关键点在于:(1)设计合理的局部贪心策略;(2)使用暴力解法作为对数器验证;(3)通过大量随机测试确保算法正确性。

2025-11-12 15:26:55 1171 1

原创 算法笔记16 - 树的递归解题套路 | 判断平衡二叉树 | 判断满二叉树 | 判断完全二叉树 | 判断搜索二叉树 | 二叉树最大距离 | 最大二叉搜索树

本文系统性地介绍了解决二叉树问题的统一递归范式(树形动态规划)。该范式通过6个步骤:假设、讨论、确定、汇总、递归、实现,让每个节点从其子树获取必要信息后返回统一的信息体(Info类)。文章以三个经典问题为例演示了该方法的应用:判断平衡二叉树需要子树高度和平衡性信息;判断满二叉树需要子树高度和满二叉树状态;判断搜索二叉树需要子树的最大/最小值及其BST状态。这套方法通过信息规约和递归加工,能够系统化解决各类二叉树问题,避免重复编码。

2025-11-07 16:15:37 987

原创 算法笔记15 - 二叉树层序遍历 | 序列化与反序列化 | 力扣431(N叉树变二叉树)| 求二叉树最大宽度 | 找后继结点 | 折痕问题

本文探讨了二叉树的核心算法,包括层序遍历、序列化与反序列化等。层序遍历通过队列实现广度优先搜索;序列化采用递归或非递归方式存储树结构,空节点需特殊标记;反序列化则通过队列或栈重建原树。Java代码实现展示了先序、后序和层序遍历的序列化与反序列化过程,为面试和学习提供了实用参考。

2025-11-03 16:11:27 1440

原创 算法笔记14 - 二叉树的遍历(递归和非递归实现)| 递归序 | 找到有环链表的入环结点 | 找到两个链表的相交结点

本文介绍了二叉树的三种遍历方式(前序、中序、后序)以及如何高效找到两个链表的相交节点。对于二叉树遍历,分别给出了递归和非递归的实现方法,其中非递归遍历利用栈模拟递归行为。对于链表相交问题,通过判断链表是否有环将问题分为三种情况处理,并利用快慢指针法检测环。重点讲解了两种无环链表相交的场景处理,以及如何通过调整指针位置找到相交节点。所有算法均满足O(N)时间复杂度和O(1)空间复杂度的要求。

2025-10-31 18:45:20 792

原创 算法笔记13 - 快慢指针 | 链表四类中点问题 | 回文链表判断 | 链表荷兰国旗问题 | 复制带随机指针的链表

摘要: 本文深入探讨链表数据结构中的核心技巧——快慢指针,通过四个变体实现精确查找链表不同中点位置(上/下中点及其前驱节点)。基于此,重点分析回文链表判断的两种解法:利用栈实现O(N)空间复杂度的方法,以及通过链表反转实现O(1)空间的优化方案。后者虽需两次反转操作以保持链表原结构,但显著降低了空间消耗,体现了算法设计中时间与空间的权衡艺术。

2025-10-27 17:30:37 957

原创 算法笔记12 - 前缀树 | 非比较排序 | 计数排序 | 基数排序 | 排序的稳定性

本文探讨了前缀树(Trie)和两种非比较排序算法(计数排序、基数排序)的核心思想和实现。前缀树通过节点设计(pass/end计数和哈希表)高效处理字符串前缀查询,支持插入、删除、查找等操作。计数排序利用数组下标定位元素,时间复杂度为O(N+K),但受限于数据范围;基数排序则通过逐位排序实现稳定排序。文章提供了完整的Java代码实现,并分析了各算法的适用场景和局限性。

2025-10-20 16:17:44 1088

原创 算法笔记11 - 增强堆 | 堆中任意元素删除、更改、改正 | 最大线段重合问题

本文介绍了一种在传统堆基础上扩展的"增强堆"结构,通过引入哈希表作为反向索引表,实现了对堆中任意元素的O(1)定位和O(logN)操作。核心内容包括:1) 使用indexMap哈希表记录元素索引,解决传统堆无法高效访问非顶部元素的问题;2) 详细实现交换、删除(remove)和调整(resign)等关键操作;3) 基于动态数组和比较器构建完整功能堆结构。该增强堆显著提升了元素删除和调整操作的效率,适用于需要频繁修改堆元素的场景。

2025-10-17 15:18:16 1022

原创 算法笔记10 - 堆 | 大根堆 | 堆排序

堆排序是一种基于堆数据结构的排序算法,主要分为建堆和排序两个阶段。文章首先介绍了大根堆的核心性质与实现,包括入堆(push)和出堆(pop)操作,以及关键的heapInsert和heapify调整方法。随后详细讲解了两种不同的建堆策略:自上而下建堆(O(N log N))和自下而上建堆(O(N)),后者通过从最后一个非叶子节点开始调整,实现了更优的时间复杂度。最后提供了完整的堆排序实现,并建议使用对数器进行正确性验证。堆排序作为一种高效的比较排序算法,其核心在于充分利用堆结构的特性进行排序。

2025-10-12 18:05:14 999

原创 算法笔记09 - 快速排序 | 荷兰国旗问题 | 分而治之的思想

本文介绍了荷兰国旗问题及其在快速排序中的应用。荷兰国旗问题要求将数组分为三部分(小于、等于、大于给定值),通过双指针解法实现高效分区。基础快速排序使用两分区版,递归处理子数组。优化版本采用三分区版,避免重复元素处理,但时间复杂度仍可能达到O(N²)。终极版本引入随机化选择主元,将期望时间复杂度优化至O(NlogN)。代码实现展示了从两分区到三分区,再到随机化快速排序的演进过程。

2025-09-29 22:19:42 1243

原创 力扣327 - 区间和的个数(归并排序解)

该文提出了一种计算数组中满足区间和条件的子数组数量的分治算法。通过构造前缀和数组,将问题转化为统计前缀和差值落在给定范围内的次数。算法采用归并排序的思路,在合并过程中使用滑动窗口技术高效统计满足条件的子数组数量。具体实现包括:1) 计算前缀和数组;2) 分治处理左右子数组;3) 合并时利用有序性通过双指针窗口统计跨区间解。通过随机生成测试用例验证了算法的正确性,时间复杂度为O(nlogn)。该方法相比暴力枚举的O(n²)方案显著提高了效率。

2025-09-29 20:44:37 520

原创 算法笔记08 - 归并排序 | 分治 | 小和问题 | 逆序对问题 | BiggerThanTwice问题 | 分治做题总结

归并排序是一种稳定高效的排序算法,采用分治策略将数组不断二分直到单元素有序,再逐步合并有序子数组。其核心在于合并过程,通过双指针依次比较左右部分元素,将较小值存入辅助数组。该算法时间复杂度稳定为O(nlogn),不受数据初始状态影响。文章详细介绍了递归实现(划分左右区间分别排序后合并)和迭代实现(通过步长控制逐步合并子数组)两种方法,并提供了完整的Java代码示例,展示了从单元素开始逐步合并直至整个数组有序的过程。

2025-09-26 17:41:46 962

原创 算法笔记07 链表 | 栈 | 队列 | 栈和队列的两种实现 | 栈和队列的转换 | 相关题目

本文介绍了链表、栈和队列三种基本数据结构及其实现方式。链表通过指针连接节点,支持高效插入删除但查找较慢;栈遵循后进先出原则,可用链表或数组实现;队列遵循先进先出原则,同样支持两种实现方式。重点讲解了双端队列的链表实现方法,并基于此实现了栈和队列。对每种数据结构的核心操作和特性进行了详细说明,包括时间复杂度分析和图示展示。

2025-09-22 16:35:35 1520

原创 算法笔记06 - 异或运算 | 交换两个变量的值 | 异或运算的其他题目

摘要:本文介绍了异或运算的基本性质及其在算法题中的应用。主要包括:1)异或运算的交换律、结合律等基本性质;2)利用异或实现不借助第三方变量交换两个数;3)找出数组中唯一出现奇数次的数;4)提取数字最右侧的1;5)找出数组中两个出现奇数次的数;6)拓展题目:找出数组中所有出现M次的数中仅出现K次的数。通过位运算技巧,这些算法问题都能高效解决,时间复杂度为O(n),空间复杂度为O(1)。

2025-09-19 20:42:34 1113

原创 算法笔记05 - 二分法 | 二分法的两道题目 | 无序数组使用二分法的特例

本文介绍了二分法的基本原理及其应用。二分法通过每次将搜索范围减半,在O(logn)时间内高效解决问题。文章详细讲解了二分法在有序数组中的两种典型应用:查找≥num的最左位置和≤num的最右位置,并给出了相应的Java实现。特别强调了避免整型溢出的mid计算方法。最后,展示了二分法在无序数组中查找局部最小值的巧妙应用,通过类比函数导数思想,证明了该方法的有效性并提供了代码实现。这些案例充分展示了二分法在不同场景下的灵活运用。

2025-09-18 21:03:10 656

原创 算法笔记04 - 选择排序 | 插入排序 | 冒泡排序 | 对数器检验

本文介绍了三种基础排序算法的实现与验证:选择排序、插入排序和冒泡排序。这三种算法的时间复杂度均为O(n²)。选择排序通过每次遍历找到最小值并交换位置;插入排序通过逐步将新元素插入已排序部分;冒泡排序通过相邻元素比较交换使最大值"冒泡"到末尾。文章还介绍了对数器验证方法,通过生成随机数组测试排序结果是否正确,确保算法实现的准确性。测试案例显示三种排序算法均能正确完成排序任务。

2025-09-17 22:07:12 386

原创 算法笔记 - 比较器 | 优先队列 | 力扣21合成两个有序链表 | 力扣23合成K个升序链表

本文介绍了合并升序链表的算法实现。对于两个链表的合并,采用双指针法依次比较节点值,将较小节点接入结果链表。对于K个链表的合并,利用优先队列(最小堆)的特性,每次取出最小值节点并加入其后续节点,直到队列为空。两种方法都保证了合并后的链表保持升序,时间复杂度分别为O(n)和O(nlogk)。文章还详细说明了Java中Comparator的使用方法,包括自定义类、匿名内部类和Lambda表达式三种实现方式。

2025-09-16 11:49:29 589

原创 力扣 - 链表2.两数相加的解答

本文介绍了如何通过链表实现两个逆序存储数字的加法运算。算法分为三个步骤:首先处理短链表结束前的各位相加并保留进位;然后处理长链表剩余部分;最后处理可能的剩余进位。通过区分长短链表、建立新链表存储结果,逐步计算每位和并处理进位,最终返回相加后的链表。该方法时间复杂度为O(max(m,n)),其中m,n为两链表长度,空间复杂度为O(max(m,n))。

2025-09-14 17:31:33 323

原创 算法笔记 - 基于Math.random()实现任何数字的随机

本文介绍将任意范围的随机数生成器转换为其他范围的方法。核心思路是:1) 先将原随机器转换为0/1二进制生成器;2) 计算目标范围0到Max所需的二进制位数;3) 通过位运算生成随机数后加上最小值。例如,将1-5随机器转换为7-19时,先转换为0-1生成器,然后用4位二进制表示0-12范围,最后加7。文章还给出了通用实现类RandomBox,通过位运算和数学技巧高效计算所需二进制位数。该方法适用于任意范围的随机数转换。

2025-09-11 13:30:13 383

空空如也

空空如也

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

TA关注的人

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