一、快速排序
算法核心是分治思想:选择一个点为轴心,将所有小于它的数放到它的左边,所有大于它的数放到它的右边,然后递归排序两侧的空间。
二、归并排序
1.划分:将待排序序列递归划分为长度为1或0的子序列(必定有序)
2.归并:将两个有序序列归并,核心是双指针算法,谁小选谁并往后移。
可用归并排序求逆序对数量:当j后移时,说明j比第一个数组中的len - i +1个数都要小,因此逆序对就要加上len - i + 1。
三、二分
核心思想是分治,可将暴力遍历(O n)的做法优化到log n,注意二分不仅用在有序数列找关键字,任意可将一个序列划分为两段的属性,都可以用二分找到那个分界点。
四、高精度算法
用数组的每一位表示十进制数的每一位,由于数组可以开很长,因此可以保证数据的精度可以很大。由于加法和乘法可能涉及到最高位的进位,而数组在尾部增加数比较容易,因此用数组从低位到高位来表示十进制数的低位到高位。
加法:用一个变量t来存储同位相加的进位值和本位和(t = a+b, 本位和是t%10,进位值是t/10)。
乘法:同加法,用t存储进位值和本位和,t = ab, 本位和是t%10,进位值是t/10。
注意加法和乘法最后还要判断t是否是0,若不是,说明最高位有进位,数组要再增加位存储t的值。
除法:用一个变量r来存储余数,每一轮将余数乘以10后加上a[i]再除以除数(r = r10 + a[i]),r/b就是本位商。注意除法是从高位到低位计算,与乘法和加法不同,若同时使用时可在除法中将数组翻转计算,最后再翻转输出,记得删去前导0。
五、前缀和和差分
前缀和:Sn为前n个数的和,Sb - Sa-1即为从a到b的数的和,预处理之后任意区间内的总和查询都可在O(1)的时间复杂度求出。
差分:前缀和的逆运算,可看成前缀和数组S[n]对应的a[n],用于多个将一段数同加/减去一个数的操作(每次实现只要O1,最后用a[n]处理得到最后的S[n],On)核心操作是插入:a[l] + c, a[r + 1] - c。该操作可实现将Sn从l到r都加上一个c,同时也可用于将Sn序列预处理成差分数组(将Sn逐个插入到an)。
六、双指针算法
核心思想是利用单调性,省去多余的遍历,将原本On²的问题化简为On,具体形式可分为:
1.双序列双指针:如归并排序
2.单序列双指针:如字符串匹配
七、位运算
计算机中 n%2或 n && 1即取出n中最低位的数(只能从低到高取)。
八、离散化
核心思想是将很大范围的稀疏点按次序映射到一个数组中,类似哈希,方便查询一个范围的和等操作。
九、区间合并
按一端排序,比较每段此端和上一段另一端的大小可得出是否有重叠,数轴线性有单调性,此思想也用于贪心。
04-30
12-14
286
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交