
数据结构与算法
文章平均质量分 94
Lion 莱恩呀
专注于后端全栈开发技术研究与分享。覆盖领域包括但不限于:C/C++底层原理与实践、Linux系统编程与运维、数据库(SQL/NoSQL)设计与优化、分布式系统架构与实现、主流中间件应用与源码、云原生(容器、K8s等)技术栈。致力于分享实战经验、系统设计思路与前沿技术洞察。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
H指数算法挑战:如何从O(N log N)到O(log N)高效计算你的学术影响力?
H 指数作为衡量科研人员学术产出数量和影响力的重要指标,其核心在于找到一个最大的 h 值,使得研究者至少有 h 篇论文的引用次数大于或等于 h。理解其定义是解决问题的第一步。在解决 H 指数计算问题时,我们探讨了三种主要的算法策略。原创 2025-07-07 09:00:00 · 801 阅读 · 0 评论 -
《长安的荔枝》背后惊天秘密!Dijkstra算法如何逆天改命,20小时送达西安?
利用图论中的路径规划算法,在给定城市交通网络中找出从深圳到西安的最优运输路线。使用Dijkstra算法以运输时间为单一优化目标,计算出最短时间路径及其总耗时。随后,将引入运输费用作为第二个优化维度,探讨双目标(时间与费用)加权优化策略,并模拟“断路”情况,展示算法在应对现实变化时的鲁棒性。原创 2025-06-26 09:00:00 · 1134 阅读 · 0 评论 -
面试官最爱的跳跃游戏解法,学会了offer拿到手软!
题目给定一个非负整数数组,初始位置为下标0,每个元素表示可跳跃的最大步数。目标为判断是否能到达最后一个下标。解题方法包括: 贪心算法(最优解):维护最远可达位置,若覆盖终末下标则返回true,时间复杂度O(n)。 动态规划:记录每个位置的可达性,空间复杂度O(n),时间复杂度O(n²)。 反向思考:从终点逆向寻找可达路径,时间复杂度O(n)。原创 2025-06-23 09:00:00 · 674 阅读 · 0 评论 -
【算法】面试官:股票交易算法怎么写?我用这招征服了他! (附C++代码)
探讨股票买卖问题,从单次交易到多次交易,循序渐进地分析了不同的解题策略。对于单次交易,一次遍历的贪心算法以其O(n)的时间复杂度和O(1)的空间复杂度脱颖而出,成为寻找最大利润的最优解。尽管动态规划提供了一种不同的思考角度,但在空间效率上略逊一筹。文章分析了多次交易的股票买卖问题,重点介绍了贪心算法的巧妙应用,通过捕捉每日价格上涨的机会来最大化利润。与单次交易相同,贪心算法以其简洁性和效率,成为解决此类问题的首选方法。动态规划虽然仍可用,但在代码复杂性和空间复杂度上并不占优。原创 2025-04-18 09:00:00 · 1007 阅读 · 0 评论 -
【算法】别再写垃圾代码了!如何在C++中实现高效的数组原地轮转?
C++中数组轮转问题的五种解决方案:暴力法、额外数组、反转数组、循环替换以及GCD优化循环替换。分析了每种算法的时间和空间复杂度,并特别关注了原地算法的实现。通过对比不同方案,展示了如何在时间和空间之间权衡,最终实现高效且节省空间的数组轮转。原创 2025-04-11 09:00:00 · 636 阅读 · 0 评论 -
【算法】击败 99% 算法!多种方法查找数组中的多数元素
剖析了查找数组中多数元素(出现次数大于 n/2 或 n/3)的问题。针对 n/2 的情况,详细讲解了哈希表、排序以及高效的摩尔投票法,并分析了各自的优缺点。对于进阶的 n/3 问题,同样提供了多种解法,包括摩尔投票法的扩展应用。掌握解决多数元素问题的多种策略,并在时间和空间复杂度之间做出最佳权衡。无论数据规模大小,都能找到适合的解决方案!原创 2025-03-29 14:22:54 · 1143 阅读 · 0 评论 -
【算法】原地删除有序数组重复项的N种解法,总有一款适合你
双指针方法是一个解决此类原地修改问题的有效方法。通过维护两个指针,一个指向下一个唯一元素的位置,另一个用于遍历数组,我们可以高效地删除重复项并保持相对顺序不变。理解排序数组的特性对于选择正确的算法至关重要。原创 2025-03-23 10:18:33 · 869 阅读 · 0 评论 -
【算法】用“龟兔赛跑”的思想原地移除元素
本题的核心思想是利用双指针法在原地移除数组中的特定元素。通过这种巧妙的双指针协同工作,算法在 O(n) 的时间复杂度和 O(1) 的空间复杂度内解决了问题,实现了高效且节省空间的元素移除操作。原创 2025-03-16 11:50:04 · 668 阅读 · 0 评论 -
【算法题】合并两个有序数组
通过对合并两个有序数组这一问题的深入探讨,学习了三种不同的解题方法:直接合并后排序、双指针法以及逆向双指针法。直接合并后排序 简单直观,易于理解,但效率较低,时间复杂度为 O((m+n)log(m+n))。双指针法 利用了数组的有序性,通过两个指针分别遍历两个数组,实现了 O(m+n) 的时间复杂度,但需要额外的 O(m+n) 空间来存储结果。逆向双指针法 在双指针法的基础上进行了优化,避免了额外的空间开销,实现了原地合并,空间复杂度降为 O(1),是本题的最优解法。原创 2025-02-25 09:00:00 · 1216 阅读 · 0 评论 -
深入理解C++中的堆:从基本概念到实际应用
堆是一种具有树形结构的数据结构,它遵循堆属性,即:每个节点必须小于其每个子节点。“堆”这个名字可能来自于这样一个事实:如果堆放一堆东西并希望它能保持平衡,人类更愿意把大的东西放在底部,小的东西放在顶部:请注意,这与包含动态分配对象的内存区域中的堆完全无关(与栈相对,栈也是一种数据结构的名称)。堆的一个最重要的特性是,其最小元素位于其根部,易于访问。在堆中,每个节点理论上可以有任意数量的子节点。但在STL中,堆的节点有两个子节点,因此在本文中将用堆来指代二叉堆。原创 2024-05-13 09:00:00 · 3144 阅读 · 2 评论 -
迷人的数据结构:揭秘数组和链表的不同
数据结构是组织和存储数据的方式,直接影响着程序性能、内存利用和资源管理等关键方面。数据结构提供了各种方法来组织和存储数据,包括数组、链表、栈、队列、树和图等。许多算法的设计和优化都与数据结构密不可分。合适的数据结构能够更有效地利用内存资源,减少资源浪费并提高程序性能。在软件工程和系统设计中,数据结构是构建复杂系统和解决实际问题的基础。数组和链表是两种常见的数据结构,本文旨在深入探讨数组和链表的区别,揭秘它们的异同点。原创 2024-01-27 21:16:11 · 917 阅读 · 2 评论 -
数据结构 | 为何红黑树在B/B+树之上仍然占据重要地位?
尽管红黑树可能导致树的高度相对较高,但其存储效率、数据局部性、平衡性能和范围查询效率等特点在内存中或需要更好的数据局部性时,红黑树更好。相比B树或B+树,红黑树的节点结构相对简单,每个节点只需额外存储一个颜色位。红黑树在插入和删除操作时能够通过旋转和重新着色来保持平衡性质。相比之下,B树或B+树的平衡调整操作(如节点的分裂和合并)可能更复杂。原创 2023-09-15 23:06:59 · 575 阅读 · 0 评论 -
探索树堆Treap和红黑树的优势和劣势
树堆(Treap)是一种组合了二叉堆和二叉搜索树特性的随机化平衡二叉树。它的基本特性和原理:键值特性:树堆的每个节点包含一个键值和一个随机的优先级值。键值用于节点的比较和排序,优先级值用于平衡树的结构。二叉搜索树性质:树堆维护了二叉搜索树的性质,即对于任意节点,它的左子树中的所有节点的键值小于该节点的键值,右子树中的所有节点的键值大于该节点的键值。堆性质:树堆也维护了堆的性质,即对于任意节点,它的优先级值大于其子节点的优先级值。随机化平衡:树堆通过随机生成节点的优先级值来实现平衡。原创 2023-09-02 17:21:56 · 488 阅读 · 2 评论 -
漫谈红黑树:红黑树的诞生与演变
追溯起来的话,红黑树的启蒙最早应该是由计算机科学家 Rudolf Bayer 和 Volker Weber 在 1972 年的一篇论文《Maintaining a Search Tree Under Dynamic Insertions and Deletions》引出的;他们的论文主要关注在外部存储器上维护平衡的二叉搜索树,用于数据库的索引结构。但是,真正的红黑树数据结构应该是Leo J. Guibas和Robert Sedgewick在1978年发布的一篇论文。原创 2023-08-20 00:00:02 · 946 阅读 · 23 评论 -
解开谜团:为什么红黑树胜过AVL树?
在文章中,着重比较红黑树和AVL树在插入、删除、查找、遍历以及内存占用等方面的性能,指出红黑树在某些应用场景下优于AVL树。同时,还将探讨两种树的优化策略和实际应用案例。原创 2023-08-13 11:57:10 · 1291 阅读 · 3 评论 -
【算法题】动态规划中级阶段之买卖股票的最佳时机、三角形最小路径和
动态规划(Dynamic Programming,简称 DP)是一种解决多阶段决策过程最优化问题的方法。它是一种将复杂问题分解成重叠子问题的策略,通过维护每个子问题的最优解来推导出问题的最优解。动态规划的主要思想是利用已求解的子问题的最优解来推导出更大问题的最优解,从而避免了重复计算。因此,动态规划通常采用自底向上的方式进行求解,先求解出小规模的问题,然后逐步推导出更大规模的问题,直到求解出整个问题的最优解。定义状态:将问题划分为若干个子问题,并定义状态表示子问题的解;原创 2023-06-30 22:57:29 · 388 阅读 · 0 评论 -
【算法题】动态规划中级阶段之不同的二叉搜索树、交错字符串
动态规划(Dynamic Programming,简称 DP)是一种解决多阶段决策过程最优化问题的方法。它是一种将复杂问题分解成重叠子问题的策略,通过维护每个子问题的最优解来推导出问题的最优解。动态规划的主要思想是利用已求解的子问题的最优解来推导出更大问题的最优解,从而避免了重复计算。因此,动态规划通常采用自底向上的方式进行求解,先求解出小规模的问题,然后逐步推导出更大规模的问题,直到求解出整个问题的最优解。定义状态:将问题划分为若干个子问题,并定义状态表示子问题的解;原创 2023-06-29 22:24:14 · 417 阅读 · 0 评论 -
【算法题】动态规划中级阶段之不同路径、最小路径和
动态规划(Dynamic Programming,简称 DP)是一种解决多阶段决策过程最优化问题的方法。它是一种将复杂问题分解成重叠子问题的策略,通过维护每个子问题的最优解来推导出问题的最优解。动态规划的主要思想是利用已求解的子问题的最优解来推导出更大问题的最优解,从而避免了重复计算。因此,动态规划通常采用自底向上的方式进行求解,先求解出小规模的问题,然后逐步推导出更大规模的问题,直到求解出整个问题的最优解。定义状态:将问题划分为若干个子问题,并定义状态表示子问题的解;原创 2023-06-29 21:51:30 · 990 阅读 · 0 评论 -
【算法题】动态规划中级阶段之跳跃游戏、最大子数组和、解码方法
动态规划(Dynamic Programming,简称 DP)是一种解决多阶段决策过程最优化问题的方法。它是一种将复杂问题分解成重叠子问题的策略,通过维护每个子问题的最优解来推导出问题的最优解。动态规划的主要思想是利用已求解的子问题的最优解来推导出更大问题的最优解,从而避免了重复计算。因此,动态规划通常采用自底向上的方式进行求解,先求解出小规模的问题,然后逐步推导出更大规模的问题,直到求解出整个问题的最优解。定义状态:将问题划分为若干个子问题,并定义状态表示子问题的解;原创 2023-06-29 21:36:12 · 723 阅读 · 0 评论 -
【算法题】动态规划中级阶段之最长回文子串、括号生成、跳跃游戏
动态规划(Dynamic Programming,简称 DP)是一种解决多阶段决策过程最优化问题的方法。它是一种将复杂问题分解成重叠子问题的策略,通过维护每个子问题的最优解来推导出问题的最优解。动态规划的主要思想是利用已求解的子问题的最优解来推导出更大问题的最优解,从而避免了重复计算。因此,动态规划通常采用自底向上的方式进行求解,先求解出小规模的问题,然后逐步推导出更大规模的问题,直到求解出整个问题的最优解。定义状态:将问题划分为若干个子问题,并定义状态表示子问题的解;原创 2023-06-29 21:15:07 · 1381 阅读 · 0 评论 -
【算法题】动态规划基础阶段之 前 n 个数字二进制中 1 的个数、爬楼梯的最少成本、翻转数位
动态规划(Dynamic Programming,简称 DP)是一种解决多阶段决策过程最优化问题的方法。它是一种将复杂问题分解成重叠子问题的策略,通过维护每个子问题的最优解来推导出问题的最优解。动态规划的主要思想是利用已求解的子问题的最优解来推导出更大问题的最优解,从而避免了重复计算。因此,动态规划通常采用自底向上的方式进行求解,先求解出小规模的问题,然后逐步推导出更大规模的问题,直到求解出整个问题的最优解。定义状态:将问题划分为若干个子问题,并定义状态表示子问题的解;原创 2023-06-28 16:02:12 · 407 阅读 · 0 评论 -
【算法题】动态规划基础阶段之斐波那契数列、青蛙跳台阶问题、连续子数组的最大和
动态规划(Dynamic Programming,简称 DP)是一种解决多阶段决策过程最优化问题的方法。它是一种将复杂问题分解成重叠子问题的策略,通过维护每个子问题的最优解来推导出问题的最优解。动态规划的主要思想是利用已求解的子问题的最优解来推导出更大问题的最优解,从而避免了重复计算。因此,动态规划通常采用自底向上的方式进行求解,先求解出小规模的问题,然后逐步推导出更大规模的问题,直到求解出整个问题的最优解。定义状态:将问题划分为若干个子问题,并定义状态表示子问题的解;原创 2023-06-28 13:18:46 · 603 阅读 · 0 评论 -
【算法题】动态规划基础阶段之获取生成数组中的最大值、传递信息、下载插件
动态规划(Dynamic Programming,简称 DP)是一种解决多阶段决策过程最优化问题的方法。它是一种将复杂问题分解成重叠子问题的策略,通过维护每个子问题的最优解来推导出问题的最优解。动态规划的主要思想是利用已求解的子问题的最优解来推导出更大问题的最优解,从而避免了重复计算。因此,动态规划通常采用自底向上的方式进行求解,先求解出小规模的问题,然后逐步推导出更大规模的问题,直到求解出整个问题的最优解。定义状态:将问题划分为若干个子问题,并定义状态表示子问题的解;原创 2023-06-28 12:43:56 · 357 阅读 · 0 评论 -
【算法题】动态规划基础阶段之斐波那契数、使用最小花费爬、除数博弈、第 N 个泰波那契数
动态规划(Dynamic Programming,简称 DP)是一种解决多阶段决策过程最优化问题的方法。它是一种将复杂问题分解成重叠子问题的策略,通过维护每个子问题的最优解来推导出问题的最优解。动态规划的主要思想是利用已求解的子问题的最优解来推导出更大问题的最优解,从而避免了重复计算。因此,动态规划通常采用自底向上的方式进行求解,先求解出小规模的问题,然后逐步推导出更大规模的问题,直到求解出整个问题的最优解。定义状态:将问题划分为若干个子问题,并定义状态表示子问题的解;原创 2023-06-28 11:32:01 · 388 阅读 · 0 评论 -
【算法题】动态规划基础阶段之买卖股票的最佳时机、比特位计数、判断子序列
动态规划(Dynamic Programming,简称 DP)是一种解决多阶段决策过程最优化问题的方法。它是一种将复杂问题分解成重叠子问题的策略,通过维护每个子问题的最优解来推导出问题的最优解。动态规划的主要思想是利用已求解的子问题的最优解来推导出更大问题的最优解,从而避免了重复计算。因此,动态规划通常采用自底向上的方式进行求解,先求解出小规模的问题,然后逐步推导出更大规模的问题,直到求解出整个问题的最优解。定义状态:将问题划分为若干个子问题,并定义状态表示子问题的解;原创 2023-06-28 09:40:17 · 823 阅读 · 0 评论 -
【算法题】动态规划基础阶段之 爬楼梯 和 杨辉三角
动态规划(Dynamic Programming,简称 DP)是一种解决多阶段决策过程最优化问题的方法。它是一种将复杂问题分解成重叠子问题的策略,通过维护每个子问题的最优解来推导出问题的最优解。动态规划的主要思想是利用已求解的子问题的最优解来推导出更大问题的最优解,从而避免了重复计算。因此,动态规划通常采用自底向上的方式进行求解,先求解出小规模的问题,然后逐步推导出更大规模的问题,直到求解出整个问题的最优解。定义状态:将问题划分为若干个子问题,并定义状态表示子问题的解;原创 2023-06-27 23:01:42 · 599 阅读 · 0 评论 -
【算法题】合并两个有序链表、删除字符串 s1 中在字符串 s2 中出现的字符、求一个论坛一天的在线人数分布
合并两个有序链表、删除字符串 s1 中在字符串 s2 中出现的字符、求一个论坛一天的在线人数分布原创 2023-06-26 11:33:15 · 239 阅读 · 0 评论 -
【算法题】剪绳子、计算二进制中1的个数、数值的整数次方
剪绳子、计算二进制中1的个数、数值的整数次方原创 2023-06-26 10:11:17 · 474 阅读 · 0 评论 -
【算法题】算法之动态规划系列(基础篇)
动态规划常常用于求解多阶段决策问题。一定要做好总结,特别是当没有解出题来,没有思路的时候,一定要通过结束阶段的总结来反思犯了什么错误。解出来了也一定要总结题目的特点,题目中哪些要素是解出该题的关键。不做总结的话,花掉的时间所得到的收获通常只有 50% 左右。在题目完成后,要特别注意总结此题最后是归纳到哪种类型中,它在这种类型中的独特之处是什么。原创 2023-06-26 09:43:46 · 695 阅读 · 1 评论 -
【算法题】神奇的斐波那契数列(Fibonacci sequence)、青蛙跳台阶问题、矩阵中的路径
【算法题】神奇的斐波那契数列(Fibonacci sequence)、青蛙跳台阶问题、矩阵中的路径原创 2023-06-26 09:29:41 · 798 阅读 · 0 评论 -
【算法题】链表系列之从尾到头打印链表、重建二叉树、用两个栈实现队列
从尾到头打印链表、重建二叉树、用两个栈实现队列原创 2023-06-25 22:34:25 · 384 阅读 · 1 评论 -
【算法题】统计各位数字之和为偶数的整数个数、替换空格、旋转数组的最小数字
统计各位数字之和为偶数的整数个数、替换空格、旋转数组的最小数字原创 2023-06-25 22:01:16 · 823 阅读 · 0 评论 -
【算法题】数组系列(找出数组中重复的数字、二维数组中的查找)
一定要做好总结,特别是当没有解出题来,没有思路的时候,一定要通过结束阶段的总结来反思犯了什么错误。解出来了也一定要总结题目的特点,题目中哪些要素是解出该题的关键。不做总结的话,花掉的时间所得到的收获通常只有 50% 左右。在题目完成后,要特别注意总结此题最后是归纳到哪种类型中,它在这种类型中的独特之处是什么。原创 2023-06-25 21:29:22 · 2712 阅读 · 0 评论 -
递归算法在编程中的重要应用
递归算法的核心思想就是函数自己调用自己。递归算法包括两个部分:基本情况和递归情况。基本情况是指一些简单、不需要继续拆分的子问题,而递归情况则是通过反复调用自身来处理较为复杂的子问题。终止条件:每个递归过程都应该有一个能够使得程序停止执行并返回结果的结束条件。逐层拆分:在每次递归中,问题规模应该比上一次缩小,并且与上一次规模相同但数据不同,以便于最终到达基本情况。传参调用:在每次调用时将参数传入函数内部,并对参数进行修改或者处理。合并结果:当遇到最小子问题时,应该直接返回结果;原创 2023-06-08 20:49:10 · 1242 阅读 · 0 评论 -
贪心算法之最优装载问题
海盗截获了一艘装满各种各样古董的货船,每件古董都价值连城,一旦打碎就失去了它的价值,海盗船载重量为$C$,每件古董的重量为$w_i$,海盗们如何尽可能多数量的宝贝装上海盗船?原创 2022-10-28 14:37:08 · 1843 阅读 · 0 评论 -
算法之神奇的斐波那契数列(Fibonacci sequence)
1. 斐波那契数列起源于兔子数列,数学源于生活。斐波那契数列与黄金分割数有着千丝万缕的关系。2. 算法难学的一个原因是算法本身具有一定的复杂性,需要持之以恒的学习和拓展自己的思维原创 2022-10-22 12:50:20 · 698 阅读 · 0 评论 -
算法的时间复杂度和空间复杂度计算
1. 将程序执行次数作为时间复杂度衡量标准。2. 时间复杂度通常用渐进上界符号$O(f(n))$表示。3. 衡量算法的好坏通常考察算法的最坏情况。4. 空间复杂度只计算辅助空间。5. 递归算法的空间复杂度需要计算递归使用的栈空间。6. 计算算法时要尽量避免爆炸级增量复杂度。原创 2022-10-18 10:19:12 · 696 阅读 · 0 评论