经典算法
文章平均质量分 92
经典算法
进朱者赤
阿里非典型程序员一枚:微信公众号同名,记录平平无奇程序员在大厂的打怪升级之路。
Java、大数据、数据结构算法
展开
-
【经典算法】LeetCode 27. 移除元素(Java/C/Python3/Go实现含注释说明,Easy)
方式优点缺点时间复杂度空间复杂度双指针原地修改,满足题目要求需要对数组进行遍历O(n)O(1)原创 2024-06-20 23:12:34 · 1575 阅读 · 2 评论 -
Eureka:服务发现与注册中心的技术瑰宝
Eureka是一个基于REST的服务,主要用于在AWS云环境中进行服务定位,它由两个组件组成:Eureka服务器和Eureka客户端。Eureka服务器用作服务注册服务器,各个微服务节点通过Eureka客户端向Eureka服务器注册自己的服务信息,并通过心跳连接来持续更新其服务状态。而在客户端,Eureka客户端会缓存服务注册表信息,并提供服务发现的功能。原创 2024-06-20 08:15:00 · 591 阅读 · 0 评论 -
决策树算法介绍、原理与案例分析
决策树是一种监督学习算法,主要用于分类问题,但也可以用于回归问题。每个内部节点表示一个特征属性上的判断条件,每个分支代表某个判断条件的输出,每个叶子节点表示一个类别标签(分类树)或一个具体数值(回归树)。决策树的构建过程遵循一定的准则,如信息增益(ID3算法)、信息增益比(C4.5算法)或基尼不纯度(CART算法)等,来选择最佳划分属性。:根据选择的最优特征将数据集划分为子集,并对每个子集递归地执行此过程,直到满足停止条件(如子集中所有样本都属于同一类别、没有更多特征可供划分或子集大小小于预设阈值等)。原创 2024-06-19 08:15:59 · 750 阅读 · 0 评论 -
【经典算法】LeetCode 8:多种编程语言实现字符串转换整数 (atoi)(Java/C/Python3/Go实现含注释说明,中等)
方式优点缺点时间复杂度空间复杂度方式一(正则)代码简洁,易于理解和实现正则表达式可能带来性能开销O(n)O(1)方式二(迭代)性能较好,没有正则表达式开销代码可能相对较长,需要手动处理更多情况O(n)O(1)原创 2024-06-19 08:06:54 · 739 阅读 · 0 评论 -
【经典算法】LeetCode 12: 整数转罗马数字(Java/C/Python3/Go实现含注释说明,Easy)
方式时间复杂度空间复杂度说明方式一:直接映射O(1)O(1)映射关系固定,查找和转换的步骤数是常数,所需数据结构大小也是常数。方式二:硬编码规则O(1)O(1)硬编码的规则导致转换步骤和所需空间都是固定的。方式三:贪心算法O(1)O(1)由于整数范围和罗马数字规则固定,贪心算法的步骤数和所需数据结构大小都是常数。需要注意的是,这里的O(1)并不意味着这些操作会瞬间完成,而是指它们的执行时间不随输入大小的增长而增长。原创 2024-06-19 07:54:23 · 963 阅读 · 0 评论 -
【经典算法】LeetCode 13:罗马数字转整数(Java/C/Python3/Go实现含注释说明,Easy)
方式优点缺点时间复杂度空间复杂度方式一实现简单、直接,效率高需要额外处理减法情况O(n)O(1)原创 2024-06-18 22:49:14 · 1383 阅读 · 1 评论 -
【经典算法】LeetCode 222. 完全二叉树的节点个数(Java/C/Python3实现含注释说明,Easy)
方式优点缺点时间复杂度空间复杂度方式一(层次遍历)直观易懂,不依赖特殊性质代码量较大,需要额外的空间存储队列O(N)O(N)(队列空间)方式二(二分查找+递归)利用完全二叉树的性质,平均性能较好递归调用栈可能较深,最坏情况下时间复杂度较高O(N log N)O(H)(H为树的高度,通常小于N)原创 2024-06-09 21:18:28 · 1142 阅读 · 4 评论 -
【经典算法】LeetCode 392 判断子序列(Java/C/Python3/Go实现含注释说明,Easy)
作者主页: 🔗精选专栏:🔗作者简介:阿里非典型程序员一枚 ,记录在大厂的打怪升级之路。一起学习Java、大数据、数据结构算法(关注,持续更新🤞。原创 2024-06-05 14:08:55 · 1259 阅读 · 22 评论 -
【经典算法】LeetCode 1103 分糖果 II(Java/C/Python3实现含注释说明,Easy)
方式优点缺点时间复杂度空间复杂度方式一逻辑清晰,容易理解需要两次遍历O(n)O(n)方式二优化了时间复杂度,只需一次遍历逻辑稍微复杂一些O(n)O(n)原创 2024-06-03 09:54:31 · 1042 阅读 · 8 评论 -
【经典算法】LeetCode112. 路径总和(Java/C/Python3/Go实现含注释说明,Easy)
方式优点缺点时间复杂度空间复杂度递归深度优先搜索(DFS)1. 代码简洁,逻辑清晰 2. 易于理解和实现1. 对于大型树,可能引发栈溢出 2. 递归调用栈占用额外空间O(N)O(H),其中H为树的高度,最坏情况下为O(N)迭代深度优先搜索(DFS)1. 避免了栈溢出问题 2. 空间复杂度相对较低1. 需要使用辅助数据结构(如栈) 2. 代码实现相对复杂O(N)O(N) 或 O(H),取决于使用的辅助数据结构。原创 2024-05-02 17:30:15 · 1019 阅读 · 2 评论 -
【经典算法】LeetCode 125. 验证回文串(Java/C/Python3实现含注释说明,Easy)
方式优点缺点时间复杂度空间复杂度双指针法代码简洁,时间效率高依赖于字符串的结构,对于非回文字符串需要遍历整个字符串O(n)O(1)辅助栈法逻辑清晰,易于理解需要额外的空间来存储栈,可能不是最优解O(n)O(n)注意:在辅助栈法中,虽然空间复杂度是O(n),但在实际情况下,由于我们只存储了字母和数字字符,所以空间复杂度可能会低于O(n)。原创 2024-05-01 13:19:19 · 88 阅读 · 4 评论 -
【经典算法】LeetCode 100. 相同的树(Java/C/Python3/Go实现含注释说明,Easy)
方式优点缺点时间复杂度空间复杂度递归法逻辑清晰,易于理解可能导致栈溢出,空间占用随树深度增加而增加O(n)O(h) (h为树的高度)迭代法不受栈大小限制,更稳定代码相对复杂,需要维护额外的数据结构(如栈或队列)O(n)O(n) (最坏情况下)使用集合法时间效率高,易于实现空间占用可能较大,尤其是当树节点值重复时O(n)O(m) (m为树中不同值的数量)原创 2024-04-29 11:03:59 · 909 阅读 · 3 评论 -
【经典算法】LeetCode 58.最后一个单词的长度(Java/C/Python3/Go实现含注释说明,Easy)
方式优点缺点时间复杂度空间复杂度方式一(字符串分割)1. 不依赖正则表达式库,实现相对独立。1. 代码量较大,实现逻辑较复杂。O(n)O(n)方式二(正则表达式)1. 代码简洁,易于理解。1. 依赖正则表达式库,可能不是性能最优解。O(n)O(1)原创 2024-04-28 21:49:44 · 821 阅读 · 0 评论 -
【经典算法】LeetCode 283. 移动零(Java/C/Python3/Go实现含注释说明,Easy)
方式优点缺点时间复杂度空间复杂度方式一(双指针)代码简洁,易于理解无明显缺点O(n)O(1)方式二(计数法)逻辑清晰,易于实现需要遍历数组两次O(n)O(1)原创 2024-04-28 08:36:43 · 921 阅读 · 3 评论 -
【经典算法】LeetCode 2两数相加(Java/C/Python3/Go实现含注释说明,中等)
方式优点缺点时间复杂度空间复杂度其他迭代方式- 直观易懂,易于实现- 代码相对较长m和n分别为两个链表的长度递归方式- 代码简洁,易于理解- 可能存在栈溢出风险(链表过长时)O(max(m, n))(递归栈空间)或 O(1)(不考虑递归栈)递归深度受链表长度限制。原创 2024-04-27 23:25:01 · 1121 阅读 · 1 评论 -
【经典算法】LeetCode28 找出字符串中第一个匹配项的下标(Java/C/Python3实现含注释说明,Easy)
方式优点缺点时间复杂度空间复杂度朴素字符串匹配实现简单效率低,当模式串与母串不匹配时,需要多次比较O(1)KMP算法效率较高,通过预处理减少不必要的比较实现相对复杂O(N+M)O(M)标准库函数(如简洁易用,性能通常经过优化依赖外部库,可能不是最灵活的选择取决于实现取决于实现。原创 2024-04-26 23:49:29 · 1348 阅读 · 5 评论 -
【经典算法】LeetCode 2739. 总行驶距离(Java/C/Python3/Go实现含注释说明,Easy)
方法优点缺点时间复杂度空间复杂度其他模拟法直观易懂可能存在冗余计算O(1)适合油量较少时,计算步骤明确数学法简洁高效需要一定的数学分析能力O(1)O(1)适用于大规模计算,直接得出结果模拟法通过循环来模拟汽车行驶和补充油的过程,直观易懂,但可能存在冗余计算,特别是在主油箱油量较大时。其时间复杂度与主油箱的油量成正比,空间复杂度为常数。数学法通过数学表达式直接计算出总行驶距离,避免了循环,代码简洁高效。但需要一定的数学分析能力来理解表达式的含义。原创 2024-04-25 20:10:19 · 725 阅读 · 0 评论 -
【经典算法】LeetCode 151. 反转字符串中的单词(Java/C/Python3实现含注释说明,中等)
方式优点缺点时间复杂度空间复杂度方式一直观且易于理解在 Java 和 Python 中可能需要额外的空间O(n)方式二递归实现相对复杂,可能导致栈溢出(在递归情况下)O(n)O(n)原创 2024-04-25 08:31:43 · 1465 阅读 · 7 评论 -
【经典算法】LeetCode 1170:比较字符串最小字母出现频次(Java/C/Python3实现含注释说明,中等)
方式优点缺点时间复杂度空间复杂度方式一不依赖内建函数,灵活性强,可适用于不同数据结构和需求代码量较大,实现相对复杂,需要手动处理字符频次统计和比较O(m + n)O(k),其中k是字符集大小方式二代码简洁,易于理解,利用内建函数简化操作依赖内建函数,可能不是最优解,合并字符串增加了空间和时间开销O(m + n)O(m + n)优化后的方式二避免了合并字符串的开销,直接在遍历过程中统计频次仍然依赖内建函数,但减少了不必要的合并操作O(m + n)原创 2024-04-24 19:52:08 · 855 阅读 · 3 评论 -
【经典算法】LeetCode 35. 搜索插入位置(Java/C/Python3/Golang实现含注释说明,Easy)
方式优点缺点时间复杂度空间复杂度方式一(二分查找)效率高,时间复杂度低需要数组有序O(log n)O(1)方式二(线性搜索)代码简单,容易理解时间复杂度较高O(n)O(1)原创 2024-04-23 08:30:00 · 2247 阅读 · 5 评论 -
【经典算法】LeetCode 69. x 的平方根(Java/C/Python3/Golang实现含注释说明,Easy)
方法优点缺点时间复杂度空间复杂度其他二分查找思路简单,直观易懂可能不是最优解,对于非整数平方根需要额外处理O(log x)O(1)适用于整数平方根计算牛顿迭代收敛速度快,通常很快能得到近似解需要选择合适的初始值和阈值近似O(1)O(1)适用于需要高精度或浮点数平方根计算。原创 2024-04-22 07:30:00 · 992 阅读 · 11 评论 -
【经典算法】LeetCode 67. 二进制求和(Java/C/Python3/Golang实现含注释说明,Easy)
方式优点缺点时间复杂度空间复杂度方式一不依赖内建函数,灵活性强代码量较大,实现相对复杂方式二代码简洁,易于理解依赖内建函数,可能不是最优解O(n)O(n) 或者O(1)原创 2024-04-21 15:42:48 · 945 阅读 · 0 评论 -
【经典算法】LeetCode 64. 最小路径和(Java/C/Python3/Golang实现含注释说明,Easy)
解法思路特点优点缺点时间复杂度空间复杂度朴素DP填充DP表,状态转移每个位置的状态取决于上方和左方直观易懂空间占用大O(mn)O(mn)滚动数组优化DP只用一维数组,通过循环更新节省空间,利用上一行的值节省空间编程稍微复杂O(mn)O(n)原创 2024-04-19 07:16:05 · 1512 阅读 · 9 评论 -
【经典算法】 leetcode88.合并排序的数组(Java/C/Python3实现含注释说明,Easy)
解题方式优点缺点时间复杂度空间复杂度其他注意事项从前往后双指针(原地修改)无需额外空间,原地修改逻辑相对复杂,需要正确处理合并细节O(m + n)O(1)需要确保nums1有足够空间从前往后双指针(需要额外空间)逻辑简单,易于理解需要额外空间存放合并结果O(m + n)O(m + n)适用于空间限制不严格的情况这两种方式都是解决合并两个有序数组问题的有效方法。选择哪种方式取决于具体的性能要求和内存限制。如果内存空间有限,或者希望避免额外的空间开销,可以选择原地修改的方式。原创 2024-04-18 13:56:53 · 1337 阅读 · 20 评论 -
【经典算法】LeetCode133克隆图(Java/C/Python3实现含注释说明,中等)
方式优点缺点时间复杂度空间复杂度DFS直观易理解可能需要较多递归调用栈空间O(V + E)O(V)BFS层次遍历需要额外维护队列O(V + E)O(V)原创 2024-04-17 08:30:00 · 1238 阅读 · 21 评论 -
【经典算法】LeetCode 136:只出现一次的数字(Java/C/Python3实现含注释说明,Easy)
方式优点缺点时间复杂度空间复杂度其他异或运算代码简洁,效率高不直观,需要理解异或运算的特性O(n)O(1)适用于数字类型的题目哈希表思路直观,易于理解空间复杂度较高,需要额外的存储空间O(n)O(n)适用于各种数据类型的题目。原创 2024-04-16 15:07:30 · 1235 阅读 · 4 评论 -
【经典算法】LeetCode 215. 数组中的第K个最大元素(Java/C/Python3实现含注释说明,Medium)
最小堆快速选择算法优点- 简单易实现- 高效,能找到第k个最大或最小元素- 适用于动态数据流- 原地操作,不需要额外空间缺点- 空间复杂度较高- 平均情况下较高时间复杂度时间复杂度- 平均:O(nlogk)- 平均:O(n)- 最差:O(nlogk)- 最差:O(n^2)空间复杂度- O(k)- 平均:O(logn)- 最差:O(n)其他- 用于处理动态数据流- 快速选择是快速排序的关键步骤。原创 2024-04-15 20:14:29 · 797 阅读 · 4 评论 -
【经典算法】LCR187:破冰游戏(约瑟夫问题,Java/C/Python3/JavaScript实现含注释说明,Easy)
方式描述优点缺点时间复杂度空间复杂度迭代模拟直接根据规则模拟整个游戏过程,依次淘汰成员直观和易理解当成员数目较大时,效率较低O(num^2)O(num)数学+迭代通过数学公式递推最终结果,逐步缩小问题规模时间效率高,不需要昂贵的删除操作需要数学知识,公式推导可能不够直观O(num)O(1)递归通过递归函数,从基础情况逐步返回最终答案代码简洁,易编写栈空间开销大,可能会栈溢出O(num)O(num)迭代改进递归方法的迭代版本,避免了栈溢出的问题。原创 2024-04-08 11:08:06 · 611 阅读 · 6 评论 -
【经典算法】LeetCode25:K 个一组翻转链表(Java/C/Python3,Hard)
递归法迭代+原地反转方法思路将链表划分为大小为k的子链表,递归处理使用循环迭代遍历链表,并在每次迭代中原地反转子链表时间复杂度O(n),每个节点被遍历一次O(n),每个节点被遍历一次空间复杂度O(n/k),递归调用栈的深度O(1),原地修改链表(如果递归栈的深度达到n/k,则创建了O(n/k)个递归调用栈帧)(不需要额外的空间,仅使用常数级别的指针变量和变量存储空间)优点实现简单,逻辑清晰不需要额外的递归调用栈,适用于大规模链表代码可读性好原地修改链表,不需要额外空间。原创 2024-04-07 09:03:34 · 923 阅读 · 0 评论 -
【经典算法】LeetCode350:两个数组的交集 II(Java/C/Python3/JavaScript实现含注释说明,Easy)
哈希表法排序和双指针法时间复杂度O(n + m) (n 和 m 分别为两个数组的长度)O(nlogn + mlogm)(n 和 m 分别为两个数组的长度)空间复杂度O(min(n, m)) (n 和 m 分别为两个数组的长度)O(min(m,n)) (C语言版本为O(1),不包括存储结果的数组,则为)提前排序不需要需要额外空间需要不需要适用场景未排序的数组已排序的数组优点- 不需要提前排序数组;- 适用于大多数情况下的数组交集问题- 不需要额外的空间用于存储哈希表;原创 2024-04-04 10:59:02 · 1047 阅读 · 4 评论 -
动态规划详解(Dynamic Programming)
动态规划的核心思想是将问题分解为一系列子问题,并通过记忆化或递推的方式求解子问题,从而得到原始问题的解。原创 2024-04-03 08:54:35 · 2168 阅读 · 2 评论 -
【经典算法】LeetCode101:对称二叉树(Java/C/Python3实现含注释说明,Easy)
方法优点缺点时间复杂度空间复杂度递归法- 直观易懂- 代码相对简洁- 可能导致函数调用栈溢出的风险- 需要额外的空间来存储函数调用栈O(n)O(n)队列法- 不会导致函数调用栈溢出的风险- 无需递归,代码较为直观- 灵活的节点入队和出队顺序- 需要手动维护队列数据结构和追踪节点的层次- 需要额外的空间来存储队列和节点的信息O(n)O(m)原创 2024-04-03 13:00:00 · 1382 阅读 · 0 评论 -
【经典算法】LeetCode 20:有效的括号(Java/C/Python3实现含注释说明,Easy)
对比点递归法栈解法思路直观性直观相对复杂递归深度问题可能存在递归深度过大导致栈溢出的风险无递归深度限制利用系统调用栈是否时间复杂度O(n)O(n)空间复杂度O(n)O(n)实现复杂性相对简单相对复杂额外空间需求无有。原创 2024-04-02 07:57:01 · 742 阅读 · 0 评论 -
【经典算法】LeetCode 21:合并两个有序链表Java/C/Python3实现含注释说明,Easy)
递归和迭代都可以用来解决将两个有序链表合并的问题。递归解法迭代解法优点简洁,易于理解和实现不涉及函数递归调用,避免递归开销和栈溢出问题缺点可能产生多个函数调用,涉及函数调用开销和栈溢出问题需要使用额外变量保存当前节点,增加代码复杂性时间复杂度O(m+n),其中m和n分别是两个链表的长度O(m+n),其中m和n分别是两个链表的长度空间复杂度O(m+n),其中m和n分别是两个链表的长度O(1)在实际应用中,如果链表较长,特别是超过系统栈的容量,采用迭代解法更为安全。原创 2024-04-01 09:00:40 · 1558 阅读 · 0 评论 -
【经典算法】LeetCode1:两数之和(Java/C/Python3实现含注释说明,Easy)
两数之和的三种解法思路,以及java和c和python的解法很详细,原创 2024-03-31 12:09:16 · 694 阅读 · 0 评论 -
【经典算法】LeetCode14:最长公共前缀(Java/C/Python3实现含注释说明,Easy)
最长公共前缀(LeetCode 14,Easy)的4种经典解法:横向扫描,纵向扫描,分治法,二分法,以及java,C,python的3种语言的实现原创 2024-03-31 11:18:49 · 1280 阅读 · 0 评论 -
必会的10个经典算法题(附解析答案代码Java/C/Python看这一篇就够)
常见的数据结构与算法题目,涵盖了数组、链表、栈、队列、二叉树、哈希表、字符串、图、排序和查找等方面的考察点。每个题目都附带有LeetCode的链接,可以点击链接了解更多题目详情。原创 2024-03-29 17:29:56 · 2566 阅读 · 1 评论 -
【经典算法】LeetCode 1143:最长公共子序列Java/C/Python3实现含注释说明,Medium)
解法时间复杂度空间复杂度备注动态规划O(m * n)O(m * n)使用二维数组保存中间计算结果递归优化O(m * n)O(m * n)使用二维数组保存中间计算结果。原创 2024-03-28 17:47:11 · 592 阅读 · 0 评论 -
Leetcode70. 爬楼梯(动态规划)
它意味着爬到第 x 级台阶的方案数是爬到第 x−1 级台阶的方案数和爬到第 x−2 级台阶的方案数的和。很好理解,因为每次只能爬 1 级或 2 级,所以 f(x) 只能从 f(x−1) 和 f(x−2) 转移过来,而这里要统计方案总数,我们就需要对这两项的贡献求和。我们不难通过转移方程和边界条件给出一个时间复杂度和空间复杂度都是 O(n) 的实现,但是由于这里的 f(x) 只和 f(x−1) 与 f(x−2) 有关,所以我们可以用「滚动数组思想」把空间复杂度优化成 O(1)。原创 2024-03-27 22:09:32 · 414 阅读 · 0 评论 -
LertCode263.丑数
既然任意一个大于一的正整数都可以分解成若干质数的乘积,那么丑数也可以被分解成若干质数的乘积,且这些质数只能是 2, 3 或 5。任意一个大于 1 的自然数,要么它本身就是质数,要么它可以分解为若干质数的乘积。原创 2024-03-26 17:53:55 · 564 阅读 · 0 评论