随笔分类 -  算法

摘要:问题一: 给定一个正整数N,求其二进制形式的第一个比特位1(从低位到高位的顺序)。 例如,给定正整数12,其低8位二进制表示为:00001100 从低位到高位的顺序,第一个1出现在第三位。 版本一: 最低位开始,针对每一位进行与(&)操作判断是否为1,直到遇到第一个1为止。 算法实现(版本一): 版 阅读全文
posted @ 2017-10-18 23:51 Qcer 阅读(423) 评论(0) 推荐(0)
摘要:一、问题描述 在一维数组(非有序状态)中找出一个元素pivot,使得其左边的元素均小于等于它,右边的元素均大于等于它,要求线性时间复杂度的算法. 二、算法分析 首先从左往右扫描整个数组,求出非递减序列,可以用布尔数组标记。然后在从右往左扫描,记录扫描过程中的最小值rightMin,在非递减序列序列中 阅读全文
posted @ 2017-09-24 12:23 Qcer 阅读(441) 评论(0) 推荐(0)
摘要:一、问题描述 给定一数组ary,元素两两组合,以min{ary[i],ary[j]}为高,以跨度(j-i)为宽可组成一个容器,求所有这样的容器的最大面积maxVolume。 二、算法分析 以数组ary为例:int[] ary = {3,2,6,8,1,7};如果从蛮力法的角度来看。相当于从以上6个元 阅读全文
posted @ 2017-09-24 11:00 Qcer 阅读(818) 评论(0) 推荐(0)
摘要:问题一:求sum值 描述:给定一有序序列ary和sum值,求序列中是否存在两元素e1和e2,其和刚好为sum。 算法思想:这是典型的两指针的用法。i指针从头部开始,j指针从尾部开始,相向移动,本质向讲,在移动过程中比较ary[i]+ary[j]与sum的大小,达到逐步排除元素的过程,缩短查找范围。最 阅读全文
posted @ 2017-09-24 00:27 Qcer 阅读(702) 评论(0) 推荐(0)
摘要:java实现: 注解都在代码里了! 阅读全文
posted @ 2017-09-23 12:12 Qcer 阅读(205) 评论(0) 推荐(0)
摘要:给定一单链表的头指针head 1、判断链表是否又环。 2、如果有环,求环长以及环的起始节点。 阅读全文
posted @ 2017-09-21 23:35 Qcer 阅读(214) 评论(0) 推荐(0)
摘要:一、k-选取问题:给定任意一个可比较的序列,从中找出第k个元素(k从0开始,默认是从小到大的次序)的问题称为k-选取(k-selection)。k-选取问题有两种退化的情况:1、0-选取问题即是找出序列的最小值问题。2、(length-1)-选取问题即是找出序列的最大值问题。以上两中问题都有最优解, 阅读全文
posted @ 2017-09-20 23:23 Qcer 阅读(378) 评论(0) 推荐(0)
摘要:一、二叉堆 堆有序:一颗二叉树中每个节点都大于或者等于其两个孩子时,就称为堆有序。根节点是堆有序的二叉树的最大节点。 堆有序的二叉树可以用指针来表示,堆有序的完全二叉树除了可以用指针表示外,还可以用数组表示。 二叉堆:二叉堆是一组堆有序的完全二叉树,并且在数组中按层级存储(不使用数组中0号位置的元素 阅读全文
posted @ 2017-09-17 18:13 Qcer 阅读(783) 评论(0) 推荐(0)
摘要:java实现: 细节和注解都在注释在代码中了。 一些值得注意的细节问题: 1、i从low开始,j从high+1开始;i和j指针移动过程中采用++i和--j的形式。 2、if (i == high) {break;}需要检查,否则在某些情况下会出错。 阅读全文
posted @ 2017-09-17 12:09 Qcer 阅读(973) 评论(0) 推荐(0)
摘要:一、merge算法 合并算法merge()总是基于这样一个事实:单个元素总是有序的。 对于原待排序列,因为单元素是最小的有序单元,因此合并算法总是从两个单元素作为待合并的子序列开始,逐步向上合并。 例如:int[] ary = {9,12,78,10,30,8,20,15,50,60};其合并轨迹为 阅读全文
posted @ 2017-09-17 10:07 Qcer 阅读(206) 评论(0) 推荐(0)
摘要:一、冒泡排序 1、算法思想: 1)、两层循环,外层循环i从0开始,内层循环从j=i+1开始2)、如果ary[i] < ary[j],则交换其值3)、直到外层循环到length-1 2、主算法实现 3、稳定性: 二、选择排序 1、算法思想 1)、两层循环,外层循环i从0开始,内层循环j从i+1开始。2 阅读全文
posted @ 2017-09-16 18:41 Qcer 阅读(243) 评论(0) 推荐(0)
摘要:一、算法思路:1、两个集合:openList和closeListopenList:存放每走一步后可能的搜索节点集合。closeList:存放已经走过的节点的集合。 2、估值函数:F = G + HF:起始节点startNode到终止节点endNode的距离G:起始节点startNode到当前节点的距 阅读全文
posted @ 2017-09-11 23:58 Qcer 阅读(253) 评论(0) 推荐(0)
摘要:一、预处理 给定任意四则运算的字符串表达式(中缀表达式),preDeal预先转化为对应的字符串数组,其目的在于将操作数和运算符分离。 例如给定四则运算内的中缀表达式: 字符串数组化后得: 二、中缀表达式转后缀表达式 规则: 遍历中缀表达式, A、如果遇到操作数直接输出 B、如果遇到运算符,分情况: 阅读全文
posted @ 2017-09-10 22:33 Qcer 阅读(1222) 评论(0) 推荐(0)
摘要:一、理解next数组 1、约定next[0]=-1,同时可以假想在sub串的最前面有一个通配符“*”,能够任意匹配。对应实际的代码t<0时的处理情况。 2、next[j]可以有如下的几种理解思路:1)next[j]为sub[j]前面的字符串的前后缀字符串匹配的最大匹配长度例如sub=“ababap” 阅读全文
posted @ 2017-09-09 23:11 Qcer 阅读(299) 评论(0) 推荐(0)
摘要:Github上的算法repo地址:https://github.com/qcer/Algo-Practice (如果你觉得有帮助,可以给颗星星收藏之~~~) 一、Java实现部分 参见随笔分类的算法部分: http://www.cnblogs.com/qcblog/category/1096247. 阅读全文
posted @ 2017-07-09 20:14 Qcer 阅读(1798) 评论(0) 推荐(0)
摘要:二分查找,其原理思想也是如此的简单明了。但事实上,据Knuth描述,第一个木有bug的二分查找是这个算法发表之后12年在出现,但后来发现还是存在一些数组越界的小问题。而如今,我们大都是开门见山的学习被前辈们优化证明的算法,这也是“牛逼顿”所谓的站在巨人的肩膀上,却也如此。 回头来看二分查找如何“花式 阅读全文
posted @ 2015-10-03 00:44 Qcer 阅读(242) 评论(0) 推荐(0)
摘要:preface: 想必,很多人都知道D.E.Knuth与V.R.Pratt和J.H.Morris同时提出所谓的狂拽酷炫屌炸天的KMP算法,在对字符串的匹配(或是字符串的查找)方面表现出比较好的效率,该算法对Brute-Force算法的较大改进,具体地讲就是消除了主串指针的回溯,从而使匹配的时间复杂度 阅读全文
posted @ 2015-06-29 19:44 Qcer 阅读(550) 评论(0) 推荐(0)