随笔分类 -  ACM算法学习

自己学习的和收集的算法都在这里
特殊的反转单链表算法(C++)
摘要:普通的单链表反转算法 大学的时候也做过好几次单链表的反转,记得当时都是用三个变量不断修改next的值然后实现反转。 1 ListNode* reverseList(ListNode* head) { 2 ListNode *pre = NULL,*tmp,*cur = head; 3 while(c 阅读全文

posted @ 2016-09-24 17:28 dinghing 阅读(344) 评论(0) 推荐(0)

数组最大差值的最优解法(动态规划)
摘要:最近在公司要计算一下我们所有用户排列中相连两个人的年龄差的到最大差值以统计公司用户年龄层。 我们公司的客户是数量很大,所以普通的排序求差值或者快排算法其实很难满足要求。 一个简单的排序算法求解如下: 上面的代码已经经过了优化,在每次循环后,保留了之前计算的差值的结果,下面的循环中小于这个差值的索引值 阅读全文

posted @ 2016-03-16 20:32 dinghing 阅读(5026) 评论(2) 推荐(0)

最大子串匹配
摘要:降低复杂度 阅读全文

posted @ 2013-01-23 16:42 dinghing 阅读(649) 评论(0) 推荐(0)

欧拉回路(邻接阵形式)
摘要:1 //求欧拉回路或欧拉路,邻接阵形式,复杂度O(n^2) 2 //返回路径长度,path返回路径(有向图时得到的是反向路径) 3 //传入图的大小n和邻接阵mat,不相邻点边权0 4 //可以有自环与重边,分为无向图和有向图 5 #define MAXN 100 6 void find_path_u(int n,int mat[][MAXN],int now,int& step,int* path){ 7 int i; 8 for (i=n-1;i>=0;i--) 9 while (mat[now][i]){10 mat[now][i... 阅读全文

posted @ 2012-08-31 08:48 dinghing 阅读(224) 评论(0) 推荐(0)

生成gray码
摘要:1 //生成reflected gray code 2 //每次调用gray取得下一个码 3 //000...000是第一个码,100...000是最后一个码 4 void gray(int n,int *code){ 5 int t=0,i; 6 for (i=0;i<n;t+=code[i++]); 7 if (t&1) 8 for (n--;!code[n];n--); 9 code[n-1]=1-code[n-1];10 } 阅读全文

posted @ 2012-08-06 15:14 dinghing 阅读(227) 评论(0) 推荐(0)

N皇后问题
摘要:常规N皇后解决问题过程:(1)针对所给问题,定义问题的解空间;(2)确定易于搜索的解空间结构;(3)以深度优先的方式搜索解空间,并且在搜索过程中用剪枝函数避免无效搜索主要算法实现如下: 1 void even1(int n,int *p){ 2 int i; 3 for (i=1;i<=n/2;i++) 4 p[i-1]=2*i; 5 for (i=n/2+1;i<=n;i++) 6 p[i-1]=2*i-n-1; 7 } 8 void even2(int n,int *p){ 9 int i;10 for (i=1;i<... 阅读全文

posted @ 2012-08-03 11:45 dinghing 阅读(309) 评论(0) 推荐(1)

模式匹配(kmp)
摘要:模式匹配,kmp算法,复杂度O(m+n)返回匹配位置,-1表示匹配失败,传入匹配串和模式串和长度可更改元素类型,更换匹配函数 1 #define MAXN 10000 2 #define _match(a,b) ((a)==(b)) 3 typedef char elem_t; 4 int pat_match(int ls,elem_t* str,int lp,elem_t* pat){ 5 int fail[MAXN]={-1},i=0,j; 6 for (j=1;j<lp;j++){ 7 for (i=fail[j-1];i>=0&&!_match(pat[.. 阅读全文

posted @ 2012-07-30 16:49 dinghing 阅读(189) 评论(0) 推荐(0)

素数表
摘要:在编程中我们常常要使用素数来解决很多的问题,当然求解素数的方法也是有很多,在这里我们先研究一个比较好的求解素数的方法,并将其制作成一个比较容易管理的素数表,方便以后的使用和处理。int plist[10000],pcount=0;int prime(int n){ int i; if ((n!=2&&!(n%2))||(n!=3&&!(n%3))||(n!=5&&!(n%5))||(n!=7&&!(n%7))) return 0; for (i=0;plist[i]*plist[i]<=n;i++) if (!(n%plis 阅读全文

posted @ 2012-07-25 18:25 dinghing 阅读(107) 评论(0) 推荐(0)

导航