自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 力扣每日一刷Day 27

本文讲解如何用卡特兰数解决Leetcode 1359题(订单组合问题)。卡特兰数适用于"不交叉"的组合计数场景,题目要求计算n笔订单的送货/收货排列组合数。通过推导发现,卡特兰数与二项式定理在此问题上等价,最终给出O(n)时间复杂度的C++实现,使用模运算防止溢出。关键点在于理解卡特兰数在此类排列组合问题中的适用性及其数学原理。

2025-09-24 11:56:32 1120

原创 力扣每日一刷Day 26

这篇文章分享了LeetCode第62题的组合数学解法。题目要求计算从网格(0,0)到(m-1,n-1)的唯一路径数,本质是求组合数C(m+n-2,m-1)。作者通过逐步计算分子分母来避免阶乘计算的溢出问题,并解释了为什么这种迭代方法能保证整除。最终给出了简洁的C++代码实现,使用long long防止溢出,时间复杂度为O(min(m,n))。文章采用轻松幽默的语言风格,将数学原理与编程实践相结合。

2025-09-23 21:37:23 849

原创 力扣每日一刷Day 25

本文介绍了贝祖定理及其在LeetCode第365题中的应用。贝祖定理指出,对于整数a和b,存在x和y使得ax+by=gcd(a,b)。该定理可用于判断目标值z是否能表示为a和b的线性组合。解题时首先检查x+y是否足够大,再通过z是否能被gcd(a,b)整除来判断可行性。数学方法简化了传统倒水过程,直接得到结论,展示了数学在算法中的高效应用。

2025-09-23 20:00:02 696

原创 力扣每日一刷Day24

本文介绍了使用埃拉托斯特尼筛法解决LeetCode 204题(统计小于n的质数个数)的方法。文章详细讲解了算法原理:通过预处理标记非质数,利用二分查找快速统计结果。重点分析了代码中的关键点:使用1LL防止整数溢出、lambda表达式初始化质数数组等。文章还提供了可视化代码,帮助理解筛法的执行过程。该方法通过预计算质数列表,将查询操作优化为O(1)时间复杂度,适用于大规模数据查询。

2025-09-22 20:56:55 985

原创 力扣每日一刷Day 23

本文介绍了LeetCode第464题"Can I Win"的解决方案,使用状态压缩动态规划(状压DP)和记忆化搜索技术。文章详细解析了题目规则,包括数字不能重复使用、先手必胜条件等核心概念。重点讲解了DFS递归函数的实现逻辑,包括状态压缩、剪枝优化和记忆化搜索等关键点。通过二进制掩码表示已选数字,使用位运算高效处理状态转移。最后提供了完整的C++代码实现和一个交互式可视化工具,帮助理解算法执行过程。该问题展示了如何将博弈论与动态规划相结合,解决复杂的状态空间问题。

2025-09-21 15:57:56 1908

原创 力扣每日一刷Day 22

本文介绍了LeetCode第312题"戳气球"的区间动态规划解法。文章详细讲解了区间DP的核心思想:通过枚举区间长度和分割点,利用子问题的解推导更大区间的最优解。作者分析了状态转移方程的构建过程,将问题分解为处理边界气球和中间气球两种情况,并提供了可视化代码帮助理解。解决方案的时间复杂度为O(N^3),其中N是气球数量。文章还包含一个交互式HTML可视化工具,可以动态展示DP表格的填充过程,帮助读者直观理解区间DP的工作原理。

2025-09-19 14:47:42 2273

原创 力扣每日一刷Day 21

本文介绍了LeetCode第337题"打家劫舍III"的树形动态规划解法。文章首先通过HTML/CSS/JavaScript创建了树形DP的可视化工具,帮助理解算法执行过程。核心解法采用递归DFS遍历二叉树,每个节点返回包含两种状态的结构体:选择该节点时的最大值和不选择时的最大值。状态转移方程为:选择当前节点时,不能选择子节点;不选择当前节点时,可取子节点两种状态中的最大值。最终比较根节点的两种状态得到结果。这种解法时间复杂度为O(n),空间复杂度为O(n),能高效解决树形结构的动态规划

2025-09-16 15:30:35 1083

原创 力扣每日一刷Day 20

本文解析了LeetCode 322题"零钱兑换"的背包DP解法。通过分析一位网友的0ms极速代码,重点讲解了动态规划的实现思路:使用数组dp记录每个金额所需最少硬币数,初始化时设为极大值,然后遍历硬币面额进行状态转移(dp[j] = min(dp[j], dp[j-coins[i]]+1))。文章还详细解读了代码中的优化技巧,包括关闭I/O同步、使用constexpr声明常量、列表初始化等C++特性,并揭露了代码中通过条件编译"作弊"获取0ms运行时间的技巧。最终方案

2025-09-10 19:00:14 882

原创 力扣每日一刷Day 19

摘要:本文通过LeetCode第70题讲解动态规划的最优子结构特性,即以子问题的最优解构建全局最优解。作者以爬楼梯问题为例,推导出递推公式f(x)=f(x-1)+f(x-2),并比较不同初始值设定的差异。给出了时间复杂度O(n)、空间复杂度O(1)的滚动数组解法,通过变量p、q、r交替存储中间值来优化空间效率。最后解释了滚动数组的实现原理,并附上官方题解链接供参考。(150字)

2025-09-01 23:52:44 786

原创 力扣每日一刷Day 18

动态规划应用于子问题重叠的问题,即不同的子问题具有公共的子子问题,接着,子子问题又可以递归的划分为更小的子子子问题。所以,我们的目的,就是选举出局部和中,最大的那个局部和!全局最大和只是我们赋予他的一个名字,全局最大和的性质,仍然是这个数组的局部和!既然我们的最大局部和是选举出来的,最大是一个绝对特性,“最”,说明只有一个,所以我们只需要一个变量来存储最大局部和就行了。法,意思就是把已经计算过的数值记录到表格中,下次需要的时候就访问对应的表格数据,而不是重新计算一遍。显然我们需要一些容器,来存储局部和。

2025-08-26 00:45:09 1035

原创 力扣每日一刷Day 17

本文介绍了KMP算法的另一种实现方法,通过将模式串与主串连接构建组合串,利用前缀函数性质实现快速匹配。具体步骤包括:在模式串后添加无关字符防止局部匹配,构建组合串的next数组,当next值等于模式串长度时即找到匹配位置。该方法通过字符串拼接简化了匹配流程,相比传统KMP实现更简洁高效。文中提供了相关代码实现和B站视频讲解链接,建议结合前一天的KMP原理讲解(Day16)一起理解。

2025-08-25 10:58:26 1002

原创 力扣每日一刷Day 16

本文介绍了KMP算法在字符串匹配中的应用。通过对比暴力遍历方法,指出KMP利用前缀函数(next数组)实现模式串指针的"瞬移",将时间复杂度优化为O(n+m)。重点讲解了前缀函数的计算原理:通过比较子串的最长相等前后缀长度构建next数组,并演示了如何利用该数组在匹配失败时快速调整模式串指针位置。文章以DNA序列匹配为例说明算法优势,最后给出了LeetCode题解的代码实现框架,强调KMP算法虽代码简洁但思想深刻。

2025-08-25 02:09:06 1184

原创 力扣每日一刷Day 15

本文介绍了使用贪心算法解决LeetCode 435题(无重叠区间)的过程。贪心算法的核心思想是通过局部最优选择达到全局最优,适用于具有最优子结构性质的问题。解题步骤包括:1)按区间结束点排序;2)遍历比较相邻区间是否重叠;3)统计无重叠区间数,用总数减去该值得到需移除的区间数。文中详细解析了C++的sort函数和lambda表达式用法,强调排序对确保正确比较的重要性。该方法时间复杂度为O(nlogn),主要来自排序操作。

2025-08-23 14:32:14 993

原创 洛谷每日一刷Day 14

本文主要讲解了Ford-Fulkerson算法及其改进版Edmonds-Karp算法在解决网络最大流问题中的应用。文章通过实例说明直接选择路径的局限性,重点介绍了Edmonds-Karp算法通过BFS优先选择最短路径的特点,并详细解析了其实现逻辑,包括反悔机制、增广路径查找和容量更新等关键步骤。最后以洛谷P3376为例,展示了完整代码实现过程,强调了处理重边等细节问题。文章深入浅出地阐述了算法原理与实现要点。

2025-08-22 16:24:10 888

原创 洛谷每日一刷Day 13

Johnson 算法用于解决多源最短路径问题,时间复杂度优于 Floyd 算法,能处理含负权边的图。其核心是通过重赋权将负权边转为非负,再结合 Dijkstra 算法求解。

2025-08-20 21:02:24 834

原创 力扣每日一刷Day 12

本文介绍了如何使用Floyd算法解决课程先决条件查询问题。通过构建可达性矩阵,利用bitset容器高效存储和操作二进制位,实现快速查询。方法包括:初始化直接先决条件关系,应用Floyd算法填充间接关系,最后通过查询可达性矩阵返回结果。该方法巧妙地利用了位运算优化性能,适合处理大规模课程关系查询。

2025-08-18 21:53:47 1068

原创 力扣每日一刷Day 11

本文讲解了Floyd算法及其在LeetCode T1334题中的应用。Floyd算法用于求解多源最短路径问题,通过中间节点逐步更新节点间的最短距离,但不能处理负权边。文章详细解释了算法实现步骤:初始化距离矩阵,对角线设为0;通过三层循环依次将每个节点作为中间节点更新最短路径;最后根据给定的距离阈值筛选符合条件的城市。题目要求选择可达城市最少且编号最大的节点,通过从大到小遍历节点并统计满足条件的路径数来实现。文末提供了完整的代码实现思路和解题步骤。

2025-08-18 13:14:41 1040

原创 力扣每日一刷Day 10

本文介绍了Bellman-Ford算法及其在LeetCode T787题中的应用。该算法适用于含负权边的单源最短路径问题,通过n-1轮松弛操作逐步更新节点最短距离。文章详细解析了算法实现步骤:初始化距离数组、进行松弛操作、判断负权环等,并对比了与Dijkstra算法的区别。作者还分享了一个优化方案,使用静态数组和memcpy等技巧提升效率,最终实现了0ms的运行速度。解题时需注意将节点数k转换为松弛轮数k+1,并通过比较距离值判断路径是否存在。

2025-08-16 23:37:13 766

原创 力扣每日一刷Day 9

本文详细讲解了Dijkstra算法在单源最短路径问题中的应用。通过线性图示例【A→B→C】演示算法执行流程,强调源节点处理规则的一致性。算法使用三个核心组件:到源节点的距离、当前处理节点、处理状态标记。文章分析了LeetCode 743题的网络延迟时间问题,指出官方解法存在暴力枚举效率低的问题,并提供了完整代码实现。关键步骤包括:构建邻接矩阵、初始化距离数组、循环更新最短路径、最终返回最大延迟时间。当存在不可达节点时返回-1。

2025-08-16 01:55:10 747

原创 力扣每日一刷Day 8

本文探讨了使用Kruskal算法解决LeetCode 1584题(连接所有点的最小费用)的优化方法。针对稠密图的特性,文章提出通过几何关系(45度角分割)将稠密图转化为稀疏图,从而提升Kruskal算法效率。详细介绍了并查集和二叉索引树(BIT)的实现,用于判断成环和快速检索区域最小边。最终通过坐标变换处理四个象限,生成候选边集合,并使用Kruskal算法构建最小生成树。该方案将原始O(n²)的边数优化为O(n)级别,显著提高了算法性能。

2025-08-13 21:36:06 1907

原创 力扣每日一刷Day 7

本文讲解了使用Prim算法解决LeetCode T1135(连接所有城市的最小成本问题)的实现思路。文章详细介绍了Prim算法的核心流程:通过优先队列选择最小权重边,逐步构建最小生成树。重点包括:1)使用邻接表存储无向图的边关系;2)通过哈希表标记已访问节点;3) 优先队列按成本排序的实现细节;4) 处理无法连通时返回-1的边界条件。代码分析部分强调了容器选择、引用传递优化等编程技巧,最后给出了完整的算法实现方案。该解法时间复杂度为O(ElogV),适用于寻找无向连通图的最小生成树问题。

2025-08-11 12:47:44 1246

原创 力扣每日一刷Day 6

Practice Day six: Leetcode T102 围绕二叉树层序遍历,讲解 BFS 应用。BFS 需按先进先出原则用队列存储节点,依次遍历并记录相邻节点。题目用二维 vector<vector<int>> 存储每层节点值。空树时,通过 if (!root) 返回空数组。队列存 TreeNode*,方便访问子节点。初始入队根节点,循环取当前层节点,存值并将子节点入队,直至队空,完成遍历。

2025-08-09 15:11:36 853

原创 力扣每日一刷Day 5

本文介绍了使用深度优先搜索(DFS)解决LeetCode岛屿数量问题的方法。DFS通过沿一个方向深入探索,遇到水(0)时停止。将访问过的陆地(1)设为水(0)避免重复计算,并对每个节点的上下左右四个方向进行等价探索。该算法通过递归嵌套遍历所有节点,直到所有岛屿被标记。这种方法能有效统计二维网格中的岛屿数量。

2025-08-04 13:02:04 295

原创 力扣每日一刷Day4

本文探讨了LeetCode第98题验证二叉搜索树(BST)的解法。通过分析二叉搜索树的构建规则(以第一个元素为根,小于根放左,大于根放右),指出其嵌套结构适合用结构体实现。解题关键在于递归验证每个节点是否满足BST条件,包括处理空指针终止条件和数值范围限制。特别强调根节点取值范围需设为极大值(如INT_MAX),但需注意整数溢出问题。最终方案采用递归判断左右子树,同时维护数值上下界来确保BST的有效性。

2025-07-31 17:15:41 465

原创 力扣每日一刷Day 3

摘要:文章讨论了Leetcode两数之和问题的优化解法。原始暴力解法需要O(n²)时间,通过先计算差值可将时间降至O(n)但仍需嵌套循环。最优解使用哈希表实现O(n)单次遍历,利用值-索引映射快速查找匹配项。官方题解提供了哈希表的具体实现方案,显著提升了算法效率。

2025-07-29 13:01:08 405

原创 力扣每日一刷Day 2

这篇文章解析了快速排序算法的核心思想,重点阐述了如何通过基准元素将数组分区。主要步骤包括:1)选择基准元素(通常取最左元素);2)使用双指针比较和交换元素;3)以基准元素为界将数组分为左右两部分;4)递归处理子数组直至完全有序。文章特别指出,这种分治策略可以优化求解第K大元素问题,当基准位置恰好等于目标位置时即可直接返回结果,避免完全排序。该算法通过多次分区操作逐步确定元素位置,相比完全排序效率更高。

2025-07-28 13:39:31 435

原创 力扣每日一刷Day 1

本文解析了LeetCode T50题"Pow(x,n)"的解题思路。通过二进制表达和分治算法,将时间复杂度优化至对数级。重点分析了如何处理奇数次幂的情况:通过二分法分解指数,在迭代过程中对余数位权进行记录和特殊处理。同时指出了使用迭代而非递归以避免栈溢出,并强调了将int类型扩展为long long防止整数溢出的重要性。文章详细阐述了从二进制位权角度理解指数分解的过程,为快速幂算法提供了清晰的理论基础。

2025-07-27 14:15:53 605 1

空空如也

空空如也

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

TA关注的人

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