
算法
文章平均质量分 53
Onlyan
这个作者很懒,什么都没留下…
展开
-
逆转字符串的三种方法
所谓逆转字符串,就是将一个字符串头尾倒置,变成一个新的字符串如:abcde -> edcbacccaa -> aaccc逆转字符串可以在线性时间内完成,所需时间与字符串长度成正比。逆转的方法很简单,只需要遍历一半字符串,并将对应位置上的字符对换即可。字符串中的字符对应一个正整数,因此下面的三种方法都是利用了变换两个整型变量的思想。1、利用最简单的交换两个变量的值的方法,即原创 2012-10-20 17:58:35 · 13147 阅读 · 0 评论 -
扩展欧几里得算法
主要用来解形如ax+by=gcd(a,b)的线性方程,其中gcd(a,b)表示a和b的最大公约数。利用扩展欧几里得算法可以求得gcd(a,b),同时返回方程的一个解。若方程的一个解是(x1,y1),则(x1+bk,y1-ak)都是方程的解,其中k是整数。实现的代码如下:#include#includeusing namespace std;__int64 e原创 2011-10-23 19:44:14 · 459 阅读 · 0 评论 -
Sparse Table算法
Sparse Table算法,简称ST算法,可以用来求解RMQ(区间最值查询)问题。RMQ问题的形式一般是:存在一个大数组,要求对于给定的起点和终点,迅速回答出这段区间的最大值或最小值。朴素的方式是扫描起点到终点的所有数,维护其中的最值,这样的复杂度是O(n^2)的,速度太慢。ST算法是使用的是类似于二分的动态规划思想,其复杂度是O(nlogn),因此查询速度非常快。ST算法的执行过程原创 2012-11-03 10:57:15 · 5466 阅读 · 0 评论 -
归并排序
归并排序是一种效率非常高的并且稳定的排序算法,借助临时数组,其平均时间复杂度为O(nlogn)。类似于快速排序,归并排序也是使用分治法将数组逐步分割成更小的数组进行排序。但快速排序是采用枢纽元将数组的元素分成左右两部分,这是导致不稳定的原因所在。而归并排序则是逐步将两个有序数组合并成一个新的有序数组,对于值相等的元素,它们的相对位置是不会改变的,因此算法是稳定的。下面通过一个例子来说明归并原创 2012-10-27 19:37:16 · 428 阅读 · 0 评论 -
二分快速幂
对于a^b,普通的求法是用一个循环一直乘b个a,这样的方法对于某些题目来说可能显得比较慢。二分快速幂是一种利用b的二进制特征来快速求a^b的算法。例如:a = 2, b = 35则b的二进制表示形式为100011则 a^b = (2^32) * (2^2) * (2^1)有了这样的思路之后,就不用循环b次了。假设b的二进制表示有n位,从后往前依次为第1-n位,初始结果为原创 2012-11-11 20:07:14 · 5165 阅读 · 2 评论 -
最小覆盖子串的长度
最小覆盖子串:对于某个字符串s,它的最小覆盖子串指的是长度最小的子串p,p满足通过自身的多次连接得到q,最后能够使s成为q的子串。比如:对于s="abcab",它的最小覆盖子串p="abc",因为p通过在它后面再接上一个p(即重叠0个字符),可以得到q="abcabc",此时s是q的子串。对于s="ababab",它的最小覆盖子串为p="ab"。根据KMP算法的next数组的定义,原创 2012-11-18 19:41:19 · 2823 阅读 · 0 评论 -
Manacher算法求最长回文子串的长度
const int N = 100005;char str[N]; //原字符串char s[N << 1]; //用'#'作为间隔填充之后的字符串int p[N << 1]; //p[i]表示以第i个字符为中心的回文子串的长度加1int len;int ans; //最长回文子串的长度void Manacher(){ int i; int mx; //mx表示当前回文子串原创 2012-11-21 15:23:57 · 888 阅读 · 0 评论