- 博客(12)
- 收藏
- 关注
原创 尺取法算法
尺取法(又称滑动窗口法、双指针法)是一种在数组或字符串中高效查找满足特定条件的子数组或子字符串的算法。它的基本思想是通过两个指针(通常称为左指针和右指针)来维护一个窗口,通过移动这两个指针来调整窗口的大小和位置,从而找到满足条件的子数组或子字符串。
2024-11-13 20:14:18
424
原创 最大公约数(辗转相除/更相减损术)
当a和b均为偶数时:gcd(a,b)=2*gcd(a/2,b/2)=2*gcd(a>>1,b>>1)当a和b均为奇数时,先利用更相减损法运算一次,此时a-b必然是偶数,然后又可以继续进行位移运算。当a为偶数,b为奇数时:gcd(a,b)=gcd(a/2,b)=gcd(a>>1,b)当a为奇数,b为偶数时:gcd(a,b)=gcd(a,b/2)=gcd(a,b>>1)计算 48÷18,得到余数 48=18×2+12(余数为 12)计算 18÷12,得到 18=12×1+6(余数为 6)
2024-10-27 20:48:49
1005
原创 快速幂算法
(n是正整数),只需要将a*a*a*a......*a,但它的时间复杂度为O(n)。很容易计算,所以只需要将它们相乘就可以,但具体是如何实现的。,105=1+8+32+64,所以可以写成。有什么办法可以快速解决这个问题,比如说。这个算法的本质是倍增原理。
2024-10-16 19:21:19
598
原创 (递归)算法
1.终止条件,当满足这个条件时,递归将停止并返回一个值,这个条件是为了防止函数无限递归,导致栈溢出。2.递归条件,这个是函数调用自身的地方,通常是通过将问题分解为更小的子问题来解决。例如求n的阶乘:当我们做题时,面对递归问题,应当分析递归,这时需用到递归树原式中为2T(n/2),所以分为俩节点计算树每层的复杂度,将所有层的复杂度相加得到最终的复杂度。自然递归结构的问题:递归定义清晰的问题:递归生成特性的问题:性能敏感问题:迭代更适合的问题:状态管理复杂的问题:
2024-10-14 18:20:37
545
原创 素数筛法算法
这段带代码为了找出2--N以内的素数,所以在函数isprime函数内进行筛选,通过素数定义很容易理解这串代码,但是在时间上的优化还远远不够。一个合数,一定存在非1非本身质因子,意思就是,例如合数4,它一定是2*2,当我们得到2时,把2的倍数都筛掉,留下来的就是素数。原理:欧拉筛法的核心思想是通过排除法,逐一标记合数,同时确保每个合数只被其最小的质因数标记一次。优化一下,将这个数开一下平方,缩小一下范围,虽然提高了运行速度,但还远远不够。这里就已经构成了筛法,但是思考一下可以发现,代码中可以不需要素数判断。
2024-10-10 19:25:33
363
原创 GCD和LCM
即GCD不依赖于输入的符号。,即LCM不依赖于输入的符号。,它们的最大公约数是唯一的。的公约数中最大的一个,即。,它们的最小公倍数是唯一的。的公倍数中最小的一个,即。:GCD 总是非负的,即。:LCM 总是非负的,即。:对于任意两个非零整数。:对于任意两个非零整数。
2024-10-09 10:39:26
939
原创 二分查找算法
此查找是在有序数组中查找某一特定元素的查找算法。查找过程从数组的中间元素开始,如果中间元素是要查找的元素,则结束。如果要查找的数大于或小于中间元素,则在大于或小于的那一半查找,而且和开始一样从中间元素开始比较,如果在某一步骤数组为空,则代表找不到。时间复杂度:O(logn)leftghtarr[mid]midarr[mid]arr[mid]
2024-10-04 19:28:02
404
原创 快速排序算法
快速排序,是一种高效的排序算法,采用分治法策略,将数组分成两个子数组,分别对其进行排序。它的平均时间复杂度是 O(nlogn),而最坏情况下为 O(),但通过优化,可以将最坏情况的发生概率降到最低。
2024-10-03 21:31:10
371
原创 堆排序算法
构建最大堆:将无序数组构建成最大堆(或最小堆)。最大堆的性质是父节点的值大于或等于其子节点的值,最小堆反之。从数组的中间开始,逐步向上调整(heapify),确保每个子树都满足堆的性质。排序过程:将堆的根节点(最大值或最小值)与堆的最后一个元素交换。缩小堆的范围(排除最后一个元素),并对新的根节点进行堆化(heapify),以维持堆的性质。重复上述步骤,直到堆的大小减为1,排序完成。
2024-10-02 22:08:54
245
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅