算法
chensilly8888
求饥若渴,大智若愚。
展开
-
排序专题学习笔记——插入排序
插入排序(Insertion sorts)专题 这类算法通过在序列内插入并批量移动元素对序列进行排序。 下面介绍的算法实现中,排序输出的结果均是由小到大排列,只要稍微修改下代码(主要是判断语句)都可以使得输出序列的结果由大到小排列。1.插入排序 Insertion sort算法(参考维基百科:http://en.wikipedia.org/wiki/Insertion_so原创 2015-01-10 23:12:44 · 764 阅读 · 0 评论 -
《编程之美》学习笔记——2.19区间重合判断
一、问题 给定一个源区间[x,y](y>=x)和N个无序的目标区间[x1,y1],[x2,y2],...,[xn,yn],判断源区间[x,y]是不是在目标区间内。例: 给定源区间[1 6]和一组无须的目标区间[2 3][1 2][3 9],即可认为区间[1 6]在区间[2 3][1 2][3 9]内(因为目标区间实际上时[1,9])。问题分析: 输入:源区间[x,y],可原创 2015-02-03 15:23:10 · 764 阅读 · 0 评论 -
《编程之美》学习笔记——2.13子数组的最大乘积
一、问题 给定一个长度为N的整数数组,只允许使用乘法,不能用除法,计算任意(N-1)个数的组合乘积中最大的一组,并写出算法的时间复杂度。分析:输入:长度为N的整数数组array。输出:这里输出两个值,(N-1)个数的组合最大乘积multiple,以及剔除的数在数组中的索引index_delete。约束:不能用除法计算。二、解法 解法一 暴力求解法原创 2015-02-18 00:02:52 · 563 阅读 · 0 评论 -
OVa Online Judge 学习笔记- AOAPC I Volume 1. Sorting/Searching
一、题目二、做题笔记1.10420 - List of Conquests知识点:字符串排序,及相似字符串统计。题目和10815相当类似,稍微修改下输出和读取格式即可。(C版本,使用qsort进行排序,自己实现用于比较字符串的compare函数)答题记录:AC拓展:可以写C++版本,调用中的sort函数进行排序。2.10474 - Where is the Marb原创 2015-03-25 16:01:50 · 1287 阅读 · 0 评论 -
OVa Online Judge 学习笔记- AOAPC I Volume 1. Elementary Problem Solving Big Number
一、题目二、做题笔记1.424 - Integer Inquiry技巧:构造高精度类。类中数组长度可以根据题目条件修改以节约空间或防止溢出。题目重点是求和。答题记录:WA原因:字符串含有前导零影响运算,实现clean方法去除前导零。第二次还出现错误:发现是输出单行结果后没有加换行符(文中并未提示)而直接结束输出所导致。2.10106 - Product技原创 2015-03-25 12:11:14 · 711 阅读 · 0 评论 -
OVa Online Judge 学习笔记
一、总学习原则: 1.使用有道词典记录单词,并提高英语阅读能力,增加词汇量。 2.《算法竞赛入门经典》指导下,先按照学习内容做题,再自由选题。 3.做好做题的笔记,记录技巧,错误原因,及新知识点总结。 4.实现优先使用C语言,设计高级算法时考虑使用C++。辅助书籍:C语言相关几个书、《算法导论》二、AOAPC I 题目总览及笔记:494:知识点:原创 2015-03-23 10:46:38 · 697 阅读 · 0 评论 -
HDOJ笔记
ID 1000: 学会使用scanf,注意scanf将忽略所有空白字符(空格、回车符、制表符)。ID 1001: 防止运算过程中,数据溢出,该问题描述中注明了结果在32位有符号整数范围内,自己写算法时会发现中间过程会存在数据溢出,需根据中间范围上界(32位无符号整数可以),考虑使用强制类型转换(unsigned)。 关键知识点:考虑数据大小,防止程序计算发生溢出现象。原创 2015-03-18 11:01:13 · 515 阅读 · 0 评论 -
OVa Online Judge 学习笔记- AOAPC I Volume 1. Elementary Problem Solving String
一、题目二、做题笔记1.10010 - Where's Waldorf?技巧:采用二维数组存储及遍历字符,使用ctype对字符进行大小写转换,注意数组边界即可解决问题。答题记录:一次通过2.10361 - Automatic Poetry技巧:putchar、gets输入输出函数使用,使用由字符串首地址加上偏移量形成的指针快速输出字符串后半部分;数组来存储匹配的字符索引原创 2015-03-24 15:25:20 · 541 阅读 · 0 评论 -
OVa Online Judge 学习笔记- AOAPC I: Volume 2. Data Structure Lists
一、题目二、C++原因:避免自己构造相应的list,包括静态存储结构,链式存储结构。C++ STL Container:1.数组 array:Arrays are fixed-size sequence containers: they hold a specific number of elements ordered in a strict linear seque原创 2015-03-27 19:43:53 · 1081 阅读 · 0 评论 -
数据结构专题——二叉查找树
一、二叉查找树(Binary Search Tree)名称二叉搜索树(Binary Search Tree) 有序二叉树(Ordered Binary Tree) 已排序二叉树(Sorted Binary Tree)二叉树性质若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 任意节点的左、右子树也分别为二原创 2015-04-01 08:25:01 · 701 阅读 · 0 评论 -
OVa Online Judge 学习笔记- AOAPC I: Volume 2. Data Structure Tree
ACM做题笔记112 - Tree Summing技巧:递归+树先序遍历知识点:利用递归获得二叉树原创 2015-04-01 16:17:25 · 652 阅读 · 0 评论 -
数据结构——图
图(Graph) (参考资料:《大话数据结构》《算法导论》) 图是由顶点的有穷非空集合和顶点之间的边的集合组成,通常表示为:G(V,E),其中G表示一个图,V是图G中顶点(Vertex)的集合,E是图中边的集合。 图的相关术语 1.无向图与有向图 无向图:图中任意两个顶点u和v之间的边没有方向(无原创 2015-04-13 19:25:51 · 749 阅读 · 0 评论 -
《算法导论》学习笔记——最长公共子序列(动态规划)
#最长公共子序列(LongestCommonSubsequence Problem;LCS)##问题描述给定两个序列$X={x_1,x_2,x_3...,x_m}$和$Y={y_1,y_2,y_3,...,y_n}$,求X和Y的最长公共子序列。>例子:$X={A,B,C,B,D,A,B}$,$y={B,D,C,A,B,A}$,最长公共子序列为${B,C,B,A}$。原创 2015-05-04 23:08:10 · 1048 阅读 · 0 评论 -
《编程之美》学习笔记——2.21只考加法的面试题
一、问题我们知道:1 + 2 = 3;4 + 5 = 9;2 + 3 + 4 = 9;等式两边都是两个以上的连续的自然数相加,那么是不是所有的整数都可以写成这样的形式呢?稍微考虑一下,我们发现,4、8等数并不能写成这样的形式。问题1:写一个程序,对于一个64位正整数,输出它所有可能的连续自然数(两个以上)之和的算式。问题分析:输入:Sum(64位正整数),可转化为:原创 2015-01-26 14:05:11 · 899 阅读 · 0 评论 -
《编程之美》学习笔记——2.17数组循环移位
一、问题设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度为O(N),且只允许使用两个附加变量。问题分析: 输入:长度为N的原数组,K 输出:循环右移K位后的数组 约束:时间复杂度要求O(N),且只允许两个附加变量二、解法 版本一:数组中的每个元素一次移到位(利用数据移位的变化规律) 思考:既然时间复杂度要求时O(n),且只允许两个附加变量,原创 2015-01-13 15:57:37 · 822 阅读 · 0 评论 -
排序专题学习笔记——交换排序
交换排序(Exchange sorts)专题这类算法通过在序列内元素之间的进行比较并交换元素对序列进行排序:冒泡排序,鸡尾酒排序,奇偶排序,梳排序,侏儒排序/地精排序,快速排序原创 2015-01-07 11:29:17 · 771 阅读 · 0 评论 -
《编程之美》学习笔记——计算字符串的距离
一、题目摘自书中: 许多程序会大量使用字符串。对于不同的字符串,我们希望能够有办法判断其相似程度。我们定义了一套操作方法来把两个不相同的字符串变得相同,具体的操作方法为:1.修改一个字符(如把“a”替换为“b”)。2.增加一个字符(如把“abdd”变为“aebdd”)。3.删除一个字符(如把“travelling”变为“traveling”)。 比如,对于“a原创 2014-12-31 08:52:35 · 757 阅读 · 0 评论 -
《编程之美》学习笔记——2.2不要被阶乘吓倒
一、问题 1、给定一个整数N,那么N的阶乘N!末尾有多少个0? 例子:10!=3 628 800,则 N!的末尾有两个0。 2、求N!的二进制表示中最低位1的位置。二、问题1解法 版本一:(自己思考的方案)数学规律解法 首先,我们可以考虑的数学规律上去寻找末尾0的个数:对于个位数之间相乘能够给出0结尾的乘法有:5*(2/4/6/8),而二位数中10 = 2原创 2015-01-11 20:39:16 · 566 阅读 · 0 评论 -
《编程之美》学习笔记——2.1求二进制中1的个数
一、题目: 求二进制中1的个数。对于一个字节(8bit)的无符号整型变量,求其二进制表示中"1"的个数,要求算法的执行效率尽可能的高。二、解法: 版本一(除法):最简单的思路,利用求余算法统计1的个数。 9 #include 10 #include 11 12 typedef unsigned char TYPE; 13 TYPE N = 234;原创 2014-12-28 20:38:17 · 942 阅读 · 0 评论 -
《编程之美》学习笔记——2.4 1的数目
一、问题(细节阅读《编程之美》): 给定一个十进制正整数N,统计从1开始,到N(含N)的所有整数中出现的所有“1”(包含各个位)的个数。原创 2014-12-28 13:53:35 · 590 阅读 · 0 评论 -
《编程之美》学习笔记——2.6精确表达浮点数
一、问题 在计算机中,使用float或者double来存储小数是不能得到精确值的。如果你希望得到精确计算结果,最好是用分数形式来表示小数。有限小数或者无限循环小数都可以转化为分数。比如: 0.9 = 9/10 0.333(3)= 1/3(括号中的数字表示是循环节) 当然一个小数可以用好几种分数形式来表示。如: 0.333(3)= 1/3 = 3/9原创 2015-01-18 15:12:53 · 860 阅读 · 0 评论 -
《编程之美》学习笔记——2.10寻找数组中的最大值和最小值
一、问题对于一个由N个整数组成的数组,需要比较多少次才能把最大值和最小值的数找出来呢?问题分析:输入:一个有限长度且为N的数组。输出:该数组的最大值max和最小值min。特点:最大值和最小值都要找到,可以考虑它们之间的关系;这个问题在《编程之美》中侧重解决尽可能减少算法内部比较次数的这个问题。结合学习:《算法导论》(第九章 中位数和顺序统计量 第一节 最小值和最大值) 文章给出了更精确的比较次数,因为这里给出了精确的比较次数(与数组长度奇数偶数相关),《编程之美》中的数据都是假设数组原创 2015-01-13 09:20:41 · 865 阅读 · 0 评论 -
《编程之美》学习笔记——2.3寻找发贴“水王”
一、问题 Tango是微软亚洲研究院的一个试验项目。研究院的员工和实习生们都很喜欢在Tango上面交流灌水。传说,Tango有一大“水王”,他不但喜欢发贴,还会回复其他ID发的每个帖子。坊间风闻该“水王”发帖数目超过了帖子总数的一半。如果你有一个当前论坛上所有帖子(包括回帖)的列表,其中帖子作者的ID也在表中,你能快速找出这个传说中的Tango水王吗?问题分析: 输入:给入一个含有重复数据的ID数组 输出:重复次数最高的ID 约束:重复次数最高的ID个数超过总数的一半。原创 2015-01-12 11:21:58 · 584 阅读 · 0 评论 -
《编程之美》学习笔记——2.7最大公约数问题
一、问题 求两个正整数的最大公约数。如果两个正整数都很大,有什么简单的算法吗?问题分析:什么是最大公约数? (参考维基百科:http://en.wikipedia.org/wiki/Greatest_common_divisor)最大公约数:Greatest Common Divisor (GCD); greatest common factor (gcf);highest原创 2015-01-14 19:45:07 · 943 阅读 · 0 评论 -
《编程之美》学习笔记——2.12快速寻找满足条件的两个数
一、问题 能否快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的数字,为了简化起见,我们假设这个数组中肯定存在至少一组符合要求的解。 问题分析: 输入:一个长度为N的数组和一个给定的数X。 输出:数组中的两个数字A和B。 约束:X = A + B,且A和B至少存在一组。 其他:题目中只说了数字,说明这些数可能为正整数、负整数、零或浮点数等,不太可能通过给原创 2015-01-18 19:27:39 · 558 阅读 · 0 评论 -
《编程之美》学习笔记——2.11寻找最近点对
一、问题给定平面上N个点的坐标,找出距离最近的两个点。分析:输入:N个点,即N组坐标(N >= 2),每个坐标可以用数据结构Point结构体来表示,存储x和y坐标。输出:两个点,即2组坐标。约束:输出的两个点在输入所有的点中距离最近。附加:可以把最小距离值也作为一个输出。思考:可以先考虑一维情况下问题的解,在拓展处理二维情况(平面)。二、一维解法我们原创 2015-02-15 18:53:13 · 713 阅读 · 0 评论 -
《编程之美》学习笔记——2.5寻找最大的K个数
一、问题 有很多无序的数,假定它们各不相等,从中找出最大的K个数。问题分析: 输入:N个数;K。 输出:N个数中最大的K个数,这K个数并不需要是有序的,只需为数组中最大的K个数即可。二、解法 解法一 排序算法数组全部数排序:可以对数组进行快速排序(O(nlgn)),然后获得最大的K个数(O(k))。这种方法下总的时间复杂度O(nlgn + k)=O(原创 2015-02-04 13:27:21 · 599 阅读 · 0 评论 -
查找(搜索)算法(**Search algorithm**)
(学习资料来源:维基百科,《算法导论》,《大话数据结构》,《编程珠玑》,《编程珠玑续》,google)查找(搜索)算法(Search algorithm)(下面的定义参考自《大话数据结构》) 查找表(Search Table)由同一类型的数据元素(或记录)构成的集合。 关键字(Key) 是数据元素中某个数据项的值,又称为键值,用它可以标识一个数据元素。也可以标志原创 2015-04-17 16:01:02 · 2115 阅读 · 0 评论