
算法学习
文章平均质量分 90
呆呆企鹅仔
阿里云专家博主认证,软件设计师,
记录工作中的进步,共勉!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
算法学习笔记:29.拓扑排序——从原理到实战,涵盖 LeetCode 与考研 408 例题
本文介绍了拓扑排序算法及其在有向无环图(DAG)中的应用。拓扑排序通过将顶点线性排列,确保所有有向边u→v中u总在v之前,适用于任务调度、课程安排、编译依赖等场景。文章详细讲解了Kahn算法(基于入度)和DFS算法两种实现方式,并通过LeetCode例题(课程表问题)进行实战分析,包括代码实现和复杂度评估。此外,还针对考研408中的典型题目进行解析,强调DAG与拓扑序的等价关系、环检测方法等核心考点。拓扑排序在项目管理、编译系统等领域具有重要应用价值,掌握其原理和实现是解决依赖关系问题的关键。原创 2025-07-18 11:41:53 · 844 阅读 · 2 评论 -
算法学习笔记:28.前缀树——从原理到实战,涵盖 LeetCode 与考研 408 例题
前缀树(Trie)是一种高效处理字符串的树形数据结构,通过共享前缀节约存储空间。其核心操作包括:插入(逐个字符创建节点)、查找(检查路径存在且结尾标记为真)、前缀匹配(只需检查路径存在)。时间复杂度均为O(L),L为字符串长度。典型应用包括自动补全、拼写检查和IP路由。文章通过LeetCode例题(208、211题)和考研408真题,详细解析了基础实现与通配符扩展方案,并对比了哈希表等数据结构的优劣。重点强调了节点结构、前缀共享机制及功能扩展方法,为字符串处理问题提供了高效解决方案。原创 2025-07-18 08:30:00 · 552 阅读 · 0 评论 -
算法学习笔记:27.堆排序(生日限定版)——从原理到实战,涵盖 LeetCode 与考研 408 例题
二叉堆是一种完全二叉树(除最后一层外,每层节点均满,最后一层节点靠左排列),分为两种类型:最大堆:每个父节点的值大于等于其左右子节点的值(parent.val ≥ left.val 且 parent.val ≥ right.val)。最小堆:每个父节点的值小于等于其左右子节点的值(parent.val ≤ left.val 且 parent.val ≤ right.val)。 堆排序中通常使用最大堆,本文以最大堆为例讲解。。原创 2025-07-17 10:23:52 · 1013 阅读 · 0 评论 -
算法学习笔记:26.二叉搜索树(生日限定版)——从原理到实战,涵盖 LeetCode 与考研 408 例题
本文系统介绍了二叉搜索树(BST)的原理与应用。BST通过"左小右大"的特性实现高效查找、插入和删除操作,其中序遍历结果严格升序是其核心性质。文章详细解析了BST的基本操作算法,包括查找、插入和删除(分三种情况处理),并通过SVG图示辅助理解。结合LeetCode例题(验证BST、有序数组转BST)和考研408真题,展示了BST的实际应用场景和解题技巧。文章还分析了BST的时间复杂度、与其他树结构的关系,并针对考研备考提炼了核心考点和常见错误。掌握BST的关键在于深入理解其中序遍历特性,原创 2025-07-17 08:30:00 · 747 阅读 · 0 评论 -
算法学习笔记:25.回溯算法之迷宫寻路——从原理到实战,涵盖 LeetCode 与考研 408 例题
本文系统讲解了回溯算法在迷宫寻路中的应用。通过分析迷宫问题定义和回溯核心思路,文章详细介绍了"尝试-回溯"的递归探索过程,包括标记位置、方向选择和回溯清理等关键步骤。结合LeetCode 490(球滚动迷宫)和79题(单词搜索)的实战案例,展示了不同约束条件下的回溯实现方法,并给出Java代码示例。同时针对考研408考点,解析了概念辨析题和算法设计题,强调访问标记管理的重要性。文章还比较了回溯与BFS、DFS等算法的差异,指出回溯适用于求所有路径而非最短路径。最后总结了迷宫寻路的实际应用原创 2025-07-16 09:39:36 · 1310 阅读 · 1 评论 -
算法学习笔记:24.回溯算法之八皇后问题 ——从原理到实战,涵盖 LeetCode 与考研 408 例题
八皇后问题是回溯算法的经典案例,要求在8×8棋盘上放置8个不互相攻击的皇后。本文详细解析了该问题的回溯解法,包括冲突检测(行、列、对角线约束)、递归实现和空间优化技巧。通过LeetCode例题(51、52题)和考研408真题演示,展示如何用Java实现算法,并分析其O(n!)的时间复杂度。文章还探讨了八皇后问题的变种与实际应用,强调回溯算法在组合优化问题中的通用性,为算法学习和考研备考提供重要参考。原创 2025-07-16 08:30:00 · 773 阅读 · 0 评论 -
算法学习笔记:23.贪心算法之活动选择问题 ——从原理到实战,涵盖 LeetCode 与考研 408 例题
《贪心算法解活动选择问题全攻略》摘要:活动选择问题是贪心算法的经典应用,要求在有限资源下选择最多互不冲突的活动。本文详细解析了贪心策略的核心思路(选择结束最早活动)、算法步骤及正确性证明,并通过LeetCode例题(435无重叠区间、646最长数对链)和考研408真题进行实战演示。文章还探讨了资源约束下的扩展解法,分析了时间复杂度(O(nlogn)),并提供了Java实现代码。最后总结了该算法在会议安排、任务调度等场景的应用价值,强调掌握贪心选择性质和最优子结构的重要性。原创 2025-07-15 14:04:12 · 1084 阅读 · 3 评论 -
算法学习笔记:22.贪心算法之霍夫曼编码 ——从原理到实战,涵盖 LeetCode 与考研 408 例题
霍夫曼编码是贪心算法在数据压缩领域的经典应用,通过构建最优前缀编码树实现高效字符压缩。其核心是通过最小堆选择频率最低的节点合并,生成霍夫曼树并分配前缀编码(左0右1),使得高频字符编码短、低频字符编码长。文章结合LeetCode例题(1167连接棒材最低费用、621任务调度器)和考研408高频考点,详解构建步骤、编码计算及其最优性证明。霍夫曼编码广泛应用于ZIP/JPEG压缩及通信领域,考研需重点掌握手动建树、带权路径长度计算及贪心算法思想。原创 2025-07-15 13:42:54 · 2136 阅读 · 5 评论 -
算法学习笔记:17.蒙特卡洛算法 ——从原理到实战,涵盖 LeetCode 与考研 408 例题
蒙特卡洛算法以其独特的随机抽样思想,为解决复杂数学问题和工程应用提供了灵活高效的方法。本文从算法的基本概念、思想出发,详细讲解了解题思路,通过圆周率估算、定积分计算和随机数生成等案例展示了算法的实际应用,并结合考研 408 的考点进行了分析。在学习过程中,需重点理解蒙特卡洛算法的随机性和概率性本质,掌握 “通过大量试验逼近真实解” 的核心思路,并能根据问题需求权衡精度与计算成本。对于考研 408 考生,需关注算法的分类、复杂度分析及典型应用,理解其与确定性算法的差异。原创 2025-07-11 10:42:24 · 753 阅读 · 0 评论 -
算法学习笔记:21.动态规划——从原理到实战,涵盖 LeetCode 与考研 408 例题
类型特点典型问题线性 DP状态按线性顺序定义爬楼梯、打家劫舍区间 DP状态按区间[i,j]定义矩阵链乘法、最长回文子串背包 DP状态含 “容量” 维度0-1 背包、完全背包树形 DP状态定义在树结构上树上最大独立集动态规划是算法设计中的 “瑞士军刀”,其核心在于通过结构化的方式分解问题,利用子问题的重叠性优化计算。掌握动态规划需要大量练习,建议从简单问题入手,逐步积累对 “状态定义” 和 “转移方程” 的敏感度。原创 2025-07-14 10:58:29 · 1013 阅读 · 0 评论 -
算法学习笔记:20.分治法——从原理到实战,涵盖 LeetCode 与考研 408 例题
摘要:分治法(Divide and Conquer)是算法设计的核心思想,通过分解、解决、合并三个步骤处理复杂问题。适用于可分解、子问题独立且可合并的问题,典型应用包括归并排序(时间复杂度O(nlogn))、快速选择和最大子数组求和。分治法与动态规划的区别在于子问题独立性,考研408重点考察算法设计、复杂度分析(如递归方程求解)和应用场景判断。掌握分治法需理解其流程,并能根据问题特性设计分解与合并策略,是计算机科学和算法考试的重要内容。原创 2025-07-14 09:48:50 · 830 阅读 · 0 评论 -
算法学习笔记:19.牛顿迭代法——从原理到实战,涵盖 LeetCode 与考研 408 例题
牛顿迭代法是一种高效的数值计算方法,通过迭代逼近方程根。其核心是通过切线逐步逼近曲线,公式为 (x_{n+1}=x_n-\frac{f(x_n)}{f'(x_n)}),具有二次收敛特性。本文介绍了牛顿法的几何意义、算法流程和收敛条件,并通过LeetCode例题(如平方根计算、验证完全平方数)展示了其编程应用。考研例题解析了手动迭代求解方程根的过程。牛顿法广泛应用于科学计算、优化问题和图形学,但需注意初始值选择和导数非零条件。原创 2025-07-13 23:03:32 · 803 阅读 · 0 评论 -
算法学习笔记:18.拉斯维加斯算法 ——从原理到实战,涵盖 LeetCode 与考研 408 例题
拉斯维加斯算法是一种保证结果正确但运行时间随机的算法,其核心流程包括随机选择、执行操作和验证结果三个阶段。与确定性算法和蒙特卡洛算法相比,拉斯维加斯算法总能给出正确结果,但运行时间存在随机性。文章通过LeetCode例题(如打乱数组、查找第K个最大元素)和考研408题目,展示了该算法的实际应用。在打乱数组问题中采用Fisher-Yates洗牌算法,在快速选择问题中利用随机pivot优化平均性能。该算法适用于解存在且可验证的问题,在密码学、游戏开发等领域有广泛应用,其平均时间复杂度通常优于确定性算法的最坏情况原创 2025-07-13 22:51:49 · 733 阅读 · 0 评论 -
算法学习笔记:16.哈希算法 ——从原理到实战,涵盖 LeetCode 与考研 408 例题
摘要: 哈希算法通过哈希函数将任意输入映射为固定长度的哈希值,具有确定性、高效性和抗碰撞性等特点。其核心思想是通过快速定位实现高效数据操作,在哈希表中应用广泛(如链地址法、开放定址法)。密码学哈希(如SHA-256)则强调不可逆性和安全性。LeetCode实战中,哈希表常用于两数之和、去重等场景,时间复杂度接近O(1)。考研408重点考察哈希表构造、碰撞处理(线性探测、链地址法)及性能分析(负载因子影响)。哈希算法在数据存储、校验及密码学中至关重要,需结合场景灵活选择实现方案。原创 2025-07-11 09:18:27 · 1016 阅读 · 0 评论 -
算法学习笔记:15.二分查找 ——从原理到实战,涵盖 LeetCode 与考研 408 例题
二分查找是一种高效的有序数据查找算法,通过不断将查找范围减半,将时间复杂度降至O(logn)。本文系统讲解了二分查找的核心原理、算法实现步骤(包括边界处理)、LeetCode典型例题(704、34、33题)的Java代码实现,并分析了其在考研408中的核心考点:时间复杂度计算、适用条件、递归/迭代实现对比以及常见错误。重点强调了有序性前提、边界条件处理技巧和不同场景的变体应用,为算法学习和考试备考提供了全面指导。原创 2025-07-10 08:15:00 · 1033 阅读 · 0 评论 -
算法学习笔记:14.线性查找——从原理到实战,涵盖 LeetCode 与考研 408 例题
线性查找(顺序查找)是最基础的查找算法,通过逐个比较元素实现查找。其核心思想是从数据结构首元素开始遍历,直到找到目标值或遍历完成。适用于数组、链表等线性结构,时间复杂度为O(n),空间复杂度O(1)。本文结合LeetCode例题(数组查找、字符串匹配等)展示Java实现,并分析考研408考点:算法原理、复杂度分析、适用场景及与二分查找的对比。线性查找虽效率不高,但实现简单、无需数据预处理,是学习更复杂算法的基础。掌握其原理对编程入门和考研备考都至关重要。原创 2025-07-10 08:00:00 · 772 阅读 · 0 评论 -
算法学习笔记:13.归并排序——从原理到实战,涵盖 LeetCode 与考研 408 例题
归并排序是一种基于分治策略的稳定排序算法,时间复杂度稳定为O(nlogn)。其核心思想是将数组不断二分至单个元素后合并,合并过程借助辅助数组实现排序。相较于快速排序,归并排序更适合处理大规模数据和链表结构。本文通过图解和Java代码详细解析了归并排序的实现过程,并应用于LeetCode例题(如912题数组排序和315题逆序对统计)及考研408真题(链表排序和概念辨析),展现其在实际问题中的高效应用,特别强调了其在稳定性要求和并行处理方面的优势。原创 2025-07-09 08:00:00 · 985 阅读 · 0 评论 -
算法学习笔记:12.快速排序 ——从原理到实战,涵盖 LeetCode 与考研 408 例题
快速排序是一种高效的分治排序算法,平均时间复杂度O(nlogn),通过选择基准元素将数组分为两个子数组递归排序。其核心是分区操作,常用Lomuto分区法。优化策略包括随机选择基准和三数取中法,避免最坏情况O(n²)。LeetCode例题(如912排序数组和215第K大元素)展示了实际应用。考研408常考时间复杂度分析、与其他排序算法对比等。快速排序适合处理大规模随机数据,但不稳定且对有序数组敏感,需根据场景选择合适的基准策略。原创 2025-07-09 08:00:00 · 2869 阅读 · 9 评论 -
算法学习笔记:11.冒泡排序——从原理到实战,涵盖 LeetCode 与考研 408 例题
本文详细介绍了冒泡排序算法,从基本原理到实际应用。冒泡排序通过相邻元素比较交换,使较大元素逐渐"下沉",时间复杂度为O(n²),最坏情况下需n-1轮排序。文章分析了算法的稳定性、原地性等特性,对比了与其他排序算法的差异,并提供了LeetCode例题的Java实现(如912题数组排序和164题最大间距)。针对考研408考点,重点讲解了时间复杂度分析、优化方法(如标志变量)等内容。虽效率不高,但冒泡排序仍是理解排序思想的经典入门案例,适合算法学习和考研备考。原创 2025-07-08 11:00:21 · 879 阅读 · 0 评论 -
算法学习笔记:10.Prim 算法——从原理到实战,涵盖 LeetCode 与考研 408 例题
Prim算法是一种用于求解最小生成树的经典贪心算法,主要应用于网络设计、电路布线等领域。其核心思想是从初始顶点出发,逐步选择连接"已选顶点集"与"未选顶点集"的最小权值边来扩展生成树。本文详细介绍了Prim算法的基本概念、执行流程、解题思路,并通过LeetCode例题(如1584题)展示了Java实现代码。文章还分析了Prim算法与Kruskal算法的区别,以及在考研408中的常见考点,包括算法原理、时间复杂度分析和正确性证明。该算法适用于稠密图,时间复杂度为n²原创 2025-07-08 10:38:31 · 1209 阅读 · 0 评论 -
算法学习笔记:9.Kruskal 算法——从原理到实战,涵盖 LeetCode 与考研 408 例题
Kruskal算法深度解析:最小生成树经典解法 Kruskal算法是求解最小生成树的经典贪心算法,通过排序边集合并利用并查集检测环来构建最小树。本文系统讲解了算法原理:从图的定义、生成树概念到算法思想的贪心策略实现过程。结合LeetCode例题(如1135和332题),展示了代码实现方法,重点分析了并查集的使用技巧。针对考研408需求,文章对比了Kruskal与Prim算法的性能差异,指出Kruskal更适合稀疏图,时间复杂度为O(ElogE)。备考建议强调通过实践掌握算法变形应用能力,建立完整知识体系。原创 2025-07-07 17:46:41 · 1469 阅读 · 0 评论 -
算法学习笔记:8.Bellman-Ford 算法——从原理到实战,涵盖 LeetCode 与考研 408 例题
Bellman-Ford算法是处理带负权边单源最短路径问题的经典算法。本文系统介绍了该算法的基本原理、松弛操作核心思想以及|V|-1次迭代的关键步骤,并详细说明了负权回路的检测方法。通过LeetCode例题(787、1345)展示了算法在解决特定问题时的实际应用与代码实现(Java)。同时,针对考研408需求,分析了该算法的考察重点,包括时间复杂度分析(O(|V|×|E|))、与其他最短路径算法的对比等。文章强调掌握Bellman-Ford算法对算法竞赛、工程实践和考研备考的重要价值。(150字)原创 2025-07-07 16:40:53 · 734 阅读 · 0 评论 -
算法学习笔记:7.Dijkstra 算法——从原理到实战,涵盖 LeetCode 与考研 408 例题
Dijkstra算法是求解单源最短路径问题的经典算法,由荷兰计算机科学家Edsger W. Dijkstra于1956年提出。该算法采用贪心策略,通过维护已确定和未确定最短路径的节点集合,逐步计算从源点到其他所有节点的最短路径距离。文章详细介绍了算法的基本概念、执行步骤和解题思路,并结合LeetCode例题(网络延迟时间和解救人质)展示了Java代码实现。此外,还分析了该算法在计算机考研408中的考点,包括图的存储结构、贪心算法思想、正确性证明以及算法变形应用等。Dijkstra算法在路径规划、网络路由等领原创 2025-07-04 16:16:44 · 1176 阅读 · 0 评论 -
算法学习笔记:6.深度优先搜索算法——从原理到实战,涵盖 LeetCode 与考研 408 例题
深度优先搜索(DFS)是一种基于递归或栈实现的搜索算法,广泛应用于图论、回溯、拓扑排序等领域。其核心思想是沿着路径尽可能深入探索,直到无法继续再回溯。DFS可通过递归(简洁但有栈溢出风险)或迭代(使用栈结构)实现,适用于岛屿数量计算、单词搜索等LeetCode题目及考研算法题。典型应用包括判断无向图回路、网格遍历等问题。该算法通过标记访问节点和回溯机制高效解决问题,是计算机科学中的重要基础算法。原创 2025-07-04 15:41:35 · 992 阅读 · 0 评论 -
算法学习笔记:5.后缀数组——从原理到实战,涵盖 LeetCode 与考研 408 例题
摘要: 后缀数组是字符串处理的重要工具,通过字典序排序所有后缀构建而成,适用于最长公共前缀、字符串匹配等问题。本文详解倍增算法构建后缀数组的过程,结合排名数组和高度数组提升效率,并通过LeetCode例题(如1163、187)展示Java实现。此外,后缀数组与考研408的数据结构、排序算法、分治思想等核心知识点紧密相关,有助于深化算法理解与应试能力。通过理论解析与实战结合,本文为算法学习者和考研生提供系统指导,建议辅以练习巩固掌握。原创 2025-07-03 18:44:09 · 586 阅读 · 0 评论 -
算法学习笔记:4.KMP 算法——从原理到实战,涵盖 LeetCode 与考研 408 例题
KMP算法是高效的字符串匹配算法,通过构建部分匹配表(next数组)避免重复比较。本文详解其核心思路:首先构建模式串的最长前缀后缀表,匹配时利用该表优化回溯过程。通过LeetCode例题(如28题字符串匹配、459题重复子串)和考研408案例分析,展示KMP算法的具体应用。文章提供Java代码实现,包括next表构建和匹配流程,强调该算法在减少时间复杂度(O(n+m))上的优势。掌握KMP算法对解决字符串匹配问题及计算机专业考试具有重要意义。原创 2025-07-03 11:40:44 · 1274 阅读 · 0 评论 -
算法学习笔记:3.广度优先搜索 (BFS)——二叉树的层序遍历
广度优先搜索(BFS)是一种逐层遍历的算法,常用于查找最短路径和层级遍历。其核心思想是通过队列实现从起点开始,逐层向外扩展搜索,确保先访问距离起点近的节点。BFS与DFS不同,前者像地毯式搜索适合找最短路径,后者则深度优先。以二叉树层序遍历为例,BFS通过队列存储节点,每次取出当前层所有节点,将其子节点加入队列,最终按层次返回节点值集合。代码实现中,使用队列存储待访问节点,循环取出并处理当前层节点,同时将下一层节点入队,形成层次遍历效果。原创 2025-06-13 20:00:00 · 461 阅读 · 0 评论 -
算法学习笔记:2.大根堆算法——数据流的中位数or最后一块石头的重量
两题均采用堆结构解题。1046题使用大根堆处理石头重量问题,每次取出最大两块石头相减,差值重新入堆,直至剩余0或1块。295题实现动态数据流的中位数查找,通过大小根堆配合:大根堆存较小半部分,小根堆存较大半部分。插入时根据总数奇偶性调整堆结构,奇数时大根堆多1元素,偶数时两堆平衡,中位数取堆顶或平均值。时间复杂度均为O(logN),空间复杂度O(N)。堆结构有效简化了动态数据的排序与查询过程原创 2025-06-12 22:00:00 · 1062 阅读 · 0 评论 -
算法学习笔记:1.摩尔投票算法——多数元素(Moore‘s Voting Algorithm)
摩尔投票算法是一种用于在数组中寻找多数元素的有效方法。所谓的多数元素就是在数组中出现次数超过一半以上的元素。所以经常用于众数的查找原创 2025-03-01 15:52:22 · 623 阅读 · 0 评论