算法
文章平均质量分 83
枫景Maple
枫景Maple
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Fisher-Yates洗牌算法解析
摘要:Fisher-Yates洗牌算法是高效公平的数组随机化算法,广泛应用于游戏开发等领域。其核心是从后往前遍历数组,每次将当前元素与随机位置的元素交换,确保每个元素出现在任意位置的概率均等(1/n)。该算法具有O(n)时间复杂度和O(1)空间复杂度,实现简洁高效。C#实现提供了数组和List两种版本,包括标准实现和性能优化方案,支持随机种子设置。数学证明表明该算法能保证完美的随机性,是Unity开发中随机化需求的首选方案。原创 2025-10-09 11:57:32 · 318 阅读 · 0 评论 -
单链表的基本原理与实现
单链表作为最基础的链式存储结构,是理解更复杂数据结构的重要基石。本文深入探讨单链表的设计原理、实现细节和操作机制,通过Java和C#的双语言实现,详细分析了链式存储相对于顺序存储的优势与局限性。文章涵盖了单链表的核心操作算法、时间复杂度分析以及实际应用场景,为开发者深入理解动态数据结构提供系统性指导。原创 2025-09-01 16:56:43 · 502 阅读 · 0 评论 -
实现动态数组
动态数组作为现代编程语言中最基础且重要的数据结构,其高效的实现直接影响应用程序的性能表现。本文深入探讨动态数组的核心实现机制,包括自动扩缩容策略、内存管理优化和边界检查机制,并提供Java和C#的完整实现代码。通过理论分析与实践相结合的方式,为开发者深入理解动态数组的底层原理提供系统性指导。原创 2025-08-29 16:22:25 · 428 阅读 · 0 评论 -
理解数组的基本原理
本文深入剖析数组的底层实现原理。从静态数组的连续内存布局和O(1)随机访问入手,分析增删查改操作复杂度:查改O(1)、末尾增删O(1)、中间增删O(n)。重点阐述动态数组扩容机制和均摊复杂度分析,结合Java和C#实现,为高效编程提供指导。原创 2025-08-28 13:08:22 · 862 阅读 · 0 评论 -
417. 太平洋大西洋水流问题(中等)题解
417. 太平洋大西洋水流问题(中等)题解原创 2025-08-22 12:46:20 · 877 阅读 · 0 评论 -
429. N 叉树的层序遍历(中等)题解
LeetCode 429. N 叉树的层序遍历 - 详细题解原创 2025-08-13 16:46:53 · 640 阅读 · 0 评论 -
2407. 最长递增子序列 II(困难)题解
本文详细解析了LeetCode 2407题,这是经典最长递增子序列问题的变种,增加了相邻元素差值不超过k的约束。由于数据规模达10^5,朴素O(n²)动态规划会超时,需要使用线段树优化。核心思路是定义dp[v]表示以值v结尾的最长子序列长度,对每个元素查询区间[num-k, num-1]内的最大dp值进行状态转移。线段树支持O(log n)的区间最大值查询和单点更新,总时间复杂度O(n log maxVal),有效解决了大规模数据的效率问题。原创 2025-08-04 00:27:22 · 847 阅读 · 0 评论 -
什么是树状数组
树状数组(Fenwick Tree)是一种基于二进制表示的高效数据结构,专门用于处理动态前缀和问题。它利用 lowbit(x) = x & -x 操作,将数组元素组织成树形结构,每个节点存储特定区间的和。核心操作包括单点更新和前缀和查询,时间复杂度均为 O(log n)。相比线段树,树状数组实现更简洁,代码量更少,但功能主要局限于前缀和相关问题。通过 i += lowbit(i) 和 i -= lowbit(i) 实现高效的父子节点跳跃,广泛应用于算法竞赛和数据处理场景。原创 2025-08-03 14:05:08 · 937 阅读 · 0 评论 -
了解一下x & -x
x & -x的原理和应用原创 2025-08-03 12:57:03 · 540 阅读 · 0 评论 -
了解一下线段树
线段树是一种二叉树结构,用于存储和处理区间相关的信息。原创 2025-08-02 15:50:52 · 410 阅读 · 0 评论 -
300. 最长递增子序列(中等)
LeetCode 300. 最长递增子序列 - 详细题解原创 2025-07-29 15:39:45 · 412 阅读 · 0 评论 -
LeetCode 541. 反转字符串 II - 题解
LeetCode 541. 反转字符串 II - 题解原创 2025-07-01 19:19:50 · 179 阅读 · 0 评论 -
LeetCode 344. 反转字符串
LeetCode 344. 反转字符串详解原创 2025-06-30 18:10:55 · 182 阅读 · 0 评论 -
6.6. 区间覆盖问题
6.6. 区间覆盖问题 - 详细题解原创 2025-06-25 12:40:00 · 950 阅读 · 0 评论 -
6.5. 最长连续回文子序列
6.5. 最长连续回文子序列 - 详细题解原创 2025-06-20 16:06:45 · 572 阅读 · 0 评论 -
6.4. 投掷硬币
6.4. 投掷硬币 - 详细题解原创 2025-06-16 17:48:02 · 960 阅读 · 0 评论 -
走迷宫 II
走迷宫 II - 详细题解原创 2025-06-10 19:51:02 · 485 阅读 · 0 评论 -
选取货物 - 题解(0-1背包问题)
选取货物 - 详细题解(0-1背包问题)原创 2025-06-09 19:34:10 · 799 阅读 · 0 评论 -
LeetCode 2297. 跳跃游戏 VIII(中等)
LeetCode 2297 跳跃游戏 VIII 是一道综合性很强的算法题,主要考查:单调栈的应用:理解两种跳跃条件对应的单调栈类型动态规划思想:用dp记录到达每个位置的最小代价贪心策略:通过单调栈保证找到的跳跃目标是最优的这道题的关键在于正确理解跳跃条件,并选择合适的数据结构来高效实现。单调栈的使用使得算法复杂度降到了线性,是解决此类问题的经典方法。原创 2025-06-04 14:38:13 · 567 阅读 · 0 评论 -
LeetCode 1871. 跳跃游戏 VII(中等)
LeetCode 1871. 跳跃游戏 VII - 详细题解原创 2025-05-28 19:35:37 · 777 阅读 · 0 评论 -
LeetCode 1696. 跳跃游戏 VI(中等)
LeetCode 1696. 跳跃游戏 VI - 详细题解原创 2025-05-27 12:33:34 · 988 阅读 · 0 评论 -
LeetCode 1340. 跳跃游戏 V(困难)
LeetCode 1340. 跳跃游戏 V - 详细题解原创 2025-05-22 14:43:15 · 1065 阅读 · 0 评论 -
LeetCode 1345. 跳跃游戏 IV(困难)
LeetCode 1345. 跳跃游戏 IV - 详细题解原创 2025-05-20 13:16:19 · 1351 阅读 · 0 评论 -
LeetCode 1306. 跳跃游戏 III(中等)
LeetCode 1306. 跳跃游戏 III - 详细题解原创 2025-05-19 14:19:05 · 1029 阅读 · 0 评论 -
LeetCode 45. 跳跃游戏 II(中等)
LeetCode 45. 跳跃游戏 II - 详细题解原创 2025-05-15 12:06:54 · 935 阅读 · 0 评论 -
LeetCode 55. 跳跃游戏(中等)
LeetCode 55. 跳跃游戏 - 详细题解原创 2025-05-14 14:42:11 · 1057 阅读 · 0 评论 -
LeetCode 714. 买卖股票的最佳时机含手续费(中等)
LeetCode 714. 买卖股票的最佳时机含手续费 - 详细题解原创 2025-05-13 15:07:23 · 802 阅读 · 0 评论 -
LeetCode 188. 买卖股票的最佳时机 IV(困难)
这道题通过动态规划解决了“最多 k 次交易”的股票买卖问题。Java 和 C# 的实现提供了两种方案:1. 三维 DP 数组版:逻辑直观,适合理解问题。2. 优化空间版:使用滚动数组,节省内存。原创 2025-03-31 23:34:40 · 986 阅读 · 0 评论 -
LeetCode 123. 买卖股票的最佳时机 III(困难)
买卖股票的最佳时机III是一个典型的动态规划问题,关键在于正确定义状态和状态转移方程。我们分别介绍了两种解法:标准动态规划解法:使用二维数组记录每天在不同交易状态下的最大利润,通过状态转移方程计算最终结果。空间优化解法:观察到每个状态只依赖于前一天的状态,将空间复杂度从O(n)优化到O(1)。原创 2025-03-26 22:23:02 · 858 阅读 · 0 评论 -
LeetCode 309. 买卖股票的最佳时机含冷冻期(中等)
LeetCode 309. 买卖股票的最佳时机含冷冻期 - 详细题解原创 2025-03-19 11:57:11 · 1058 阅读 · 0 评论 -
LeetCode 122. 买卖股票的最佳时机 II(中等)
LeetCode 122. 买卖股票的最佳时机 II 题解原创 2025-03-08 21:36:29 · 935 阅读 · 0 评论 -
LeetCode 121. 买卖股票的最佳时机(简单)
我们可以在遍历数组的同时,记录到目前为止见到的最低价格,并计算如果在这个最低价格买入、当前价格卖出能获得的利润。在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5。更聪明的方法是利用一个关键洞察:要获得最大利润,我们需要以尽可能低的价格买入,然后在之后尽可能高的价格卖出。例如 [1,2,3,4,5],最大利润为4,应该在第一天买入,最后一天卖出。例如 [7,6,4,3,1],最大利润为0,因为没有可以盈利的交易机会。原创 2025-03-05 15:59:42 · 692 阅读 · 0 评论 -
LeetCode 1186. 删除一次得到子数组最大和(中等)
这道题是经典动态规划问题的变种,关键在于定义好状态和状态转移方程。通过维护两个状态(删除和不删除元素的最大和),我们可以在线性时间内解决这个问题。明确定义状态写出状态转移方程确定初始状态计算最终结果。原创 2025-03-03 14:29:08 · 407 阅读 · 0 评论
分享