算法
文章平均质量分 74
wefg1
keep coding
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【算法】贪心
贪心算法摘要 贪心算法是一种通过局部最优选择逐步构建全局最优解的算法策略。其核心思想是将问题分解为多个步骤,每一步都选择当前看似最优的解,从而期望最终得到全局最优解。 特点: 贪心策略因问题而异,没有固定模板; 同一问题可能存在多种贪心策略; 贪心策略的正确性需要严格证明。 示例应用: 找零问题:优先使用最大面额纸币; 最小路径和:错误示例展示贪心策略的局限性; 背包问题:不同贪心策略(按体积、价值或单位价值)可能导致错误解。 经典问题: 柠檬水找零:优先使用10元纸币; 数组减半:每次选择最大数减半; 最原创 2026-06-24 12:44:01 · 235 阅读 · 0 评论 -
一些零散的算法
在下面的代码中,由于二分查找需要确定待查找区间的左右端点,刚开始查找时,左端点是 0,右端点是 ret + 1,ret 就是最长上升子序列的长度,如果最后找到的插入位置是 ret + 1,那么 ret++给定一个字符串数组strs,再给定两个字符串str1和str2,返回在strs中str1和str2的最小距离,如果str1或str2为null,或不在strs中,返回-1。解法:遍历数组的同时,用两个变量标记当前位置之前的最后出现的 str1 和 str2 的下标。原创 2026-05-11 21:13:02 · 450 阅读 · 0 评论 -
【算法】排序
快速排序、希尔排序、堆排序、归并排序、插入排序、冒泡排序、选择排序原创 2025-04-11 20:00:34 · 1265 阅读 · 0 评论 -
【算法】约数个数、约数和
本文介绍了计算整数约数的几种方法:1)试除法求单个数的所有约数,时间复杂度O(√n);2)倍数法求[1,n]每个数的约数集合;3)约数个数定理,通过质因数分解计算约数个数;4)约数和定理,通过质因数分解计算约数之和。每种方法都给出了具体实现代码,适用于不同场景下的约数计算需求,包括约数枚举、个数统计和求和等操作。原创 2026-03-09 20:54:46 · 275 阅读 · 0 评论 -
【算法】算数基本定理、分解质因数
算术基本定理指出,任何大于1的自然数都可以唯一分解为质数的乘积(如360=2³×3²×5)。分解质因数时,只需枚举2到√n的数,若能整除就除尽并计数,最后处理剩余的大于√n的质因子。对于阶乘n!的质因数分解,可以分别分解2到n的每个数后累加质因子次数,或者直接统计每个质数在阶乘中的出现次数。两种方法的时间复杂度均为O(√n)到O(logn)不等,适用于不同场景的质因数分解需求。原创 2026-03-09 19:54:49 · 287 阅读 · 0 评论 -
【算法】质数的判定/质数筛(埃氏筛/线性筛)
本文介绍了质数与合数的基本概念,重点讲解了三种判断和筛选质数的方法:试除法用于判断单个数的质数性质,时间复杂度为O(√n);埃拉托斯特尼筛法通过标记倍数来筛选质数,时间复杂度为O(nloglogn);欧拉筛法(线性筛)通过最小质因数标记每个合数,确保每个数只被筛一次,时间复杂度优化至O(n)。文章详细说明了各种算法的实现原理和代码示例,包括防溢出处理和优化技巧,为质数相关问题提供了高效的解决方案。原创 2026-03-07 20:13:07 · 363 阅读 · 0 评论 -
【算法】gcd 和 lcm
本文介绍了约数和倍数的基本概念,重点阐述了最大公约数(GCD)和最小公倍数(LCM)的求解方法。详细说明了欧几里得算法(辗转相除法)的原理、实现步骤和递归代码实现,分析了其时间复杂度为O(logn)。同时介绍了三个数GCD的计算方法(先求前两数GCD再与第三数求GCD)以及利用GCD求LCM的公式(LCM = a×b / GCD(a,b))。这些算法在数论和编程中具有重要应用价值。原创 2026-03-06 20:03:58 · 140 阅读 · 0 评论 -
【算法】字符串哈希
本文介绍了字符串哈希的基本概念与应用。哈希函数将字符串映射为整数(通常使用p=131或13331的进制转换),并讨论了哈希冲突问题。重点阐述了前缀哈希数组的预处理方法(O(n)时间复杂度)和快速查询子串哈希值的技巧(利用公式f[r]-f[l-1]*p^(r-l+1))。通过维护前缀哈希数组f[i]和p的幂次数组p[i],可将子串查询优化至O(1)。最后给出了C++实现模板,包括初始化函数init_hash()和查询函数get_hash(),适用于字符串匹配和去重等场景。原创 2026-02-26 19:41:38 · 422 阅读 · 0 评论 -
【算法】单调栈和单调队列
摘要:本文介绍了单调栈和单调队列两种数据结构及其应用。单调栈是具有单调递增或递减特性的栈结构,用于高效解决元素最近较大/较小值的查找问题,包括四种变体情况。单调队列是具有单调性的双端队列,主要用于快速求解滑动窗口的最大值和最小值问题。文章提供了两种数据结构的实现模板,并强调存储元素下标的重要性。时间复杂度均为O(N),每个元素最多入栈/出栈一次。原创 2026-02-25 19:05:13 · 361 阅读 · 0 评论 -
【算法】离散化
本文介绍了离散化算法的原理和实现方法。离散化适用于数据范围大但总量不大的情况,通过将数据值映射为较小范围内的下标来优化处理。算法实现步骤包括:1)存储原始数据;2)排序预处理;3)使用哈希表建立映射关系;4)输出离散化结果。文中提供了C++代码示例,展示了如何对输入数据进行排序、去重并建立值到连续编号的映射,最终输出每个原始值对应的离散化结果。该技术能有效处理大规模稀疏数据问题。原创 2026-02-22 20:27:39 · 61 阅读 · 0 评论 -
【算法】倍增思想(快速幂)
本文介绍了快速幂算法的实现原理和代码模板。算法通过将指数b转换为二进制形式,利用位运算判断是否需要累乘a的对应次方,从而高效计算a^b。代码实现采用while循环和位操作,通过取模防止数值溢出。该模板函数qpow接收底数a、指数b和模数p,返回a^b mod p的结果。主函数通过输入参数调用qpow并输出计算结果。这种算法的时间复杂度为O(logb),比传统O(b)的循环方法更高效。原创 2026-02-22 19:25:45 · 325 阅读 · 0 评论 -
【算法】模运算的技巧
摘要:本文讨论了模运算的几个关键性质和应用。首先介绍了同余定理及其逆定理,说明a≡b(mod p)等价于a%p=b%p。其次讲解了负数模正数的修正方法,提出"模加模"技巧来保证结果为正数。对于只含加法和乘法的运算,可以在任意中间步骤取模而不影响最终结果。但当涉及除法时,必须使用逆元才能正确取模。文中通过C++代码示例展示了这些性质的实际应用,特别是在防止中间结果溢出方面的优势。原创 2026-02-22 19:00:32 · 230 阅读 · 0 评论 -
【算法】动态规划(路径/线性/背包/子数组子序列/区间dp/两数组)
摘要:本文系统介绍了动态规划(DP)的核心解题思路和应用场景。首先阐述了DP的基本框架:1)确定状态表示(一维/二维DP表);2)推导状态转移方程;3)处理边界初始化;4)确定填表顺序;5)确定返回值。随后详细讲解了各类经典DP问题的解法,包括路径问题(如不同路径)、多状态问题(如打家劫舍)、子数组/子序列问题(如最长递增子序列)、回文串问题(如回文子串)以及背包问题(01背包和完全背包)。特别强调了状态表示的选择技巧和空间优化方法(滚动数组),并通过LeetCode真题展示了如何将理论应用于实际问题求解。原创 2026-01-12 18:25:57 · 1507 阅读 · 2 评论 -
【算法】深度优先遍历/搜索(递归、回溯、剪枝)
本文系统讲解了递归算法的核心概念与应用技巧。首先阐述了递归的本质是主问题分解为相同结构的子问题,并通过函数自我调用来解决。其次详细介绍了递归设计方法:分解问题、明确参数、设计函数头和函数体,并强调信任递归黑盒和设置终止条件的重要性。通过汉诺塔、链表合并、排列组合等经典例题,展示了递归在树形结构和线性结构中的不同应用场景。同时讲解了回溯和剪枝的优化技巧,以及记忆化搜索如何避免重复计算。最后以数独、N皇后等问题为例,演示了递归在复杂搜索问题中的实际应用,为算法学习提供了清晰的思路框架。原创 2025-12-09 14:05:09 · 1107 阅读 · 0 评论 -
【算法】宽度优先遍历(BFS)
摘要:宽度优先搜索(BFS)是一种按层遍历的图搜索算法,其核心思想是通过队列实现"由近及远"的访问顺序,保证首次到达目标即为最短路径。BFS具有完备性和最优性特点,适用于无权图的最短路径、迷宫求解等问题。在树结构中可应用于层序遍历(如LeetCode 102、103题);在图结构中可处理FloodFill算法(如LeetCode 733、200题)。BFS还能有效解决边权为1的最短路径问题(如LeetCode 1926、433题)以及拓扑排序(如LeetCode 207题)。算法实现时需原创 2025-10-19 20:08:19 · 1203 阅读 · 0 评论 -
【算法】高精度运算
本文介绍了两种字符串模拟数值运算的方法:1、n进制数相加:通过逆序处理字符串,逐位相加并处理进位,最后反转结果字符串。2、十进制数相乘:采用"无进位相加"策略,先逆序字符串,进行位相乘后存储到临时数组,再统一处理进位,最后反转结果字符串。两种方法都避免了低效的头插操作,通过逆序处理简化了数位对齐问题。原创 2025-10-09 23:26:49 · 322 阅读 · 0 评论 -
【算法】分治(运用快排、归并的思想解决问题)
本文介绍了快速排序和归并排序两种高效排序算法的原理与实现。快速排序采用分治思想,通过选取基准值将数组分割为三部分(小于、等于和大于基准值),然后递归处理左右子序列。归并排序则是将数组不断二分,先排序子数组再合并有序子数组。文章详细分析了两种算法的递归实现框架、关键步骤及优化技巧,并给出了LeetCode相关例题的解法,包括颜色分类、数组中的第K大元素、统计逆序对等问题,展示了这两种排序算法在实际问题中的应用。原创 2025-09-27 12:38:49 · 950 阅读 · 0 评论 -
【算法】位运算解决算法题
本文总结了常见位运算操作及其应用。主要内容包括:1)7种基本位运算操作(按位与、或、异或等);2)位运算经典例题解析,包括查找数组中只出现一次的数字、判断字符串字符唯一性、寻找缺失数字等;3)多种解法对比,如位运算、哈希表、数学法等。通过位运算技巧(如提取最右侧1、位图思想等),可以高效解决相关问题,时间复杂度和空间复杂度较优。原创 2025-09-05 19:31:51 · 742 阅读 · 0 评论 -
【算法】前缀和与差分(一维/二维)
本文介绍了前缀和在数组和矩阵中的高效应用。一维前缀和通过预处理构造前缀和数组,可在O(1)时间查询任意区间和;二维前缀和通过递推公式预处理矩阵,快速计算子矩阵和。两者均需注意边界处理(下标从1开始)。时间复杂度为预处理O(N)或O(N²)加每次查询O(1),适用于频繁求和的场景。文章包含实现代码和例题,并指出前缀和思想可扩展至统计其他聚合值(如最大值、方差等),还介绍了后缀和的概念及其应用。原创 2025-08-27 20:00:17 · 894 阅读 · 0 评论 -
【算法】二分查找
本文系统介绍了二分查找算法的原理与应用。算法核心是通过判断中间值性质,每次排除一半元素,将O(n)复杂度降至O(logn)。文章详细讲解了标准二分查找模板和两种常用变体模板(寻找左/右端点),重点分析了不同场景下二段性特征的划分方法。通过7个典型例题(如查找边界、平方根、旋转数组最小值等),演示了如何根据不同问题特性设计二分策略,包括终止条件、中间值计算和边界更新的处理技巧。特别强调了防溢出写法mid=left+(right-left)/2的重要性,并对比了不同模板的适用场景和注意事项。原创 2025-08-24 19:59:20 · 1286 阅读 · 0 评论
分享