Algorithm
文章平均质量分 75
月光下的夜曲
AN ICONOCLAST
展开
-
埃拉托色尼筛选法
最近在复习算法,求素数是一个很常用的算法。不禁引发了我的一些思考。 想到大一的时候用暴力枚举法求素数了,埃式筛选法求素数是一个比较好的算法。 在网上看了一下,没有把这个算法讲的比较清晰的博客,于是我打算自己梳理一下。 比如要求从1到n范围内的素数表,基本算法思想就是从第一个质数2开始,把2的所有倍数标记为非素数,然后进入到3,把3的所有倍数标记为非素数,然后跳过4(因原创 2015-03-25 19:46:15 · 5539 阅读 · 1 评论 -
LintCode贪心法题总结
贪心法的题目主要就考你会不会做,知道就知道,不知道那就很难知道。没啥套路,所以需要把这些题目过一遍。82. Single Number一个数组中,每个数字都出现了2次,只有一个数字出现了1次,要求找到那个数。可以用HashSet来记录,但是这样会消耗额外空间,以及HashSet的查找也额外花时间。可以利用异或操作^,a^a=0, a^0=a,根据交换律a^b=b^a,比如3^4^3=4,根原创 2016-08-10 13:49:04 · 1073 阅读 · 0 评论 -
LintCode双指针/滑动窗口/Two Sum类型题总结
双指针题算是数组类型题目的一个子模块了。373. Partition Array by Odd and Even把一个数组划分为奇数在前偶数在后的状态,要求in place。很简单,就用双指针法,让两个指针从两头往中间扫描,当左边是偶数右边是奇数时就交换,直到左右指针相遇为止。 public void partitionArray(int[] nums) { in原创 2016-08-10 19:33:41 · 6719 阅读 · 1 评论 -
LintCode图论&搜索题总结
LintCode上Graph & Search那一章有这些题目:137. Clone Graph给一个邻接表表示的图,返回一个它的深拷贝。这道题的关键在于用BFS首先克隆所有的点,然后再克隆所有的边。克隆点的时候需要用到HashSet来保存每一个节点。原创 2016-06-19 16:20:59 · 2424 阅读 · 2 评论 -
LintCode线段树/扫描线/查询题总结
线段树(Segment Tree)又叫区间树(Interval Tree),它实际上是一颗二叉树,北大的POJ上有关于这个高级数据结构的介绍:http://poj.org/summerschool/1_interval_tree.pdfLintCode上线段树专题下有这些题目:原创 2017-05-20 06:33:49 · 5038 阅读 · 0 评论 -
LintCode高级数据结构/Trie/并查集/搜索题总结
搜索也是很常考的题目,有些搜索要求一些高级的数据结构来加速搜索过程,比如Trie Tree,并查集Union Find等等。我们先来看看Trie Tree,Trie Tree其实就是一种树原创 2017-05-04 03:17:47 · 1492 阅读 · 0 评论 -
LintCode堆栈题总结
这篇是基于我之前的一篇文章的:LintCode数据结构题 那篇文章介绍了基本的堆栈实现以及一些基本的应用。现在来看一下更多的题目和应用来扩展一下对堆栈的实践。575. Expression Expand要求对表达式进行展开。比如 s = 3[2[ad]3[pf]]xyz, return adadpfpfpfadadpfpfpfadadpfpfpfxyz。这道题可以用一个栈Stack来解决。原创 2017-06-05 13:01:33 · 1317 阅读 · 0 评论 -
LintCode动态规划题总结
不知道什么是动态规划的,传送门在这儿:[干货]动态规划十问十答动态规划进阶:动态规划:从新手到专家相信看完上面两个链接的博客后,应该对于动态规划有一个新的认识和了解了。接下来就来看看LintCode上DP(下文我将以DP或者Dynamic Programming代替动态规划)的题目。原创 2016-08-13 23:45:39 · 4230 阅读 · 0 评论 -
LintCode背包问题总结
背包是动态规划的一种题型,它的特点如下:特点: 1. 用值作为dp维度2. dp过程就是填写矩阵3. 可以用滚动数组进行优化有个背包问题九讲的链接推荐:背包问题九讲92. BackpackGiven n items with size Ai, an integer m denotes the size of a backpack. How full you can原创 2017-08-01 12:26:22 · 4099 阅读 · 0 评论 -
LintCode数组题总结
做算法题的时候,几乎不可避免要跟数组打交道。在LintCode上数组那一章有这么一些题目:1)547. Intersection of Two Arrays比较简单。要求找到2个数组的交集,简单点的方法就是用2个hashSet,第一个HashSet存第一个数组的元素。然后扫描第二个数组,如果第二个数组中的元素在第一个HashSet中出现了,那么就把它加到第二个Has原创 2016-06-02 23:16:57 · 3522 阅读 · 0 评论 -
LintCode二分查找题总结
LC上二分查找那一章有这么些题:二分查找的题经常用于考,因为它虽然看似简单,但其实要完全正确却不容易,很容易写出死循环的程序。一个二分查找的程序可以很容易判断出一个人功底扎不扎实。457. Classical Binary Search这是一道非常经典的二分查找题,给出一个有序数组以及一个目标值target,要求返回target在数组中的位置,若数组里不存在ta原创 2016-08-03 15:53:49 · 6001 阅读 · 0 评论 -
LintCode排序题总结
排序作为CS的基本功,需要单独拿出来总结一下。这是一个直观地可以观看各种排序算法的可视化效果的网址(强烈推荐):http://www.cs.usfca.edu/~galles/visualization/ComparisonSort.html184. Largest Number给定一个数组,要求对这些数字进行组合,使得组合成的整数最大。我们以输入两个数9, 97为例,将这两个数组原创 2016-08-12 17:34:16 · 1237 阅读 · 0 评论 -
LintCode数据结构题总结
Lintcode数据结构有这么一些题目:495. Implement Stack用任意的数据结构实现一个栈,我是用List实现的,记得写的时候写成List array = new ArrayList(); 因为List只是Interface,而实现List接口的有多个类,其中一种就是ArrayList,然后记住List的三种操作是add/remove/get,Arr原创 2016-06-10 22:46:07 · 2879 阅读 · 0 评论 -
LintCode字符串题总结
LintCode上tag标记为String的题目大概有30多道题。408. Add Binary在我之前写的一篇LintCode位运算题总结的博文里有提到,此处便不再赘述。133. Longest Words给定一个string数组,要求找到这个数组里最长的单词是哪些。最简单的方法就是两趟遍历,第一趟统计最长的单词长度,第二趟统计有哪些单词满足这个长度,则取出来。原创 2016-08-05 12:00:31 · 2638 阅读 · 1 评论 -
生成字典序全排列
最近用到了C++ STL里的next_permutation函数,刚好又在复习算法,于是想到了生成全排列的算法。 有好几种算法可以生成全排列,比如自底向上插入生成全排列、Johnson-Trotter算法生成、字典序生成等等。 我想到用字典序生成全排列的一个算法。 字典序排列就是按照字典a-z,1-9的顺序给出字符串的顺序全排列,例如abc的全排列就是从a原创 2015-03-27 21:10:39 · 3373 阅读 · 0 评论 -
KMP字符串匹配(初学者必看,讲的很清晰)
从头到尾彻底理解KMP首先声明一下,本博文转自July的博客,之前看了很多关于KMP算法的博客,发现都没讲清楚,但看了July的博客后,我就对KMP算法有了一个很清楚的认识,在这里我要感谢July。转自http://blog.csdn.net/v_july_v/article/details/7041827作者:July时间:最初写于2011年12月,201转载 2015-03-29 10:34:03 · 9764 阅读 · 2 评论 -
二叉树重建
有这样一道题目,给出二叉树的前序遍历顺序和中序遍历顺序,让你求(1)它的广度优先遍历顺序。(2) 它的后续遍历顺序。(1)在http://soj.sysu.edu.cn/1935 (2)在http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1944 二道题目的做法都差不多,关键是要根据前序和中序遍历构建出这棵二叉树原创 2015-03-29 19:57:45 · 471 阅读 · 0 评论 -
进制转换问题
题目在此http://soj.sysu.edu.cn/1813 题目大意就是输入2个k进制的数A和B,要求出A/B 和 A%B。 解题思路可以这样:我们虽然不知道如何在K进制下进行除法和求余数,但是我们知道在10进制下如何进行。所以思路就是先把这两个数转换成10进制进行运算,再把运算的结果转换成K进制。这样一来,题目的难点就变成了求两个函数:分别是10进制转换成K进制 和 K进原创 2015-03-30 18:57:13 · 882 阅读 · 0 评论 -
二分法求解方程的近似解(sicily 1017)
求解一元多次方程的解,我们可以利用二分法来求解近似解,一般来说函数是递增的。然后就通过二分法不断逼近目标值。一般题目会给定一个误差范围,比如精确到小数点后6位,就算是OK的了。 sicily上有一道类似的题目 http://soj.sysu.edu.cn/1017Sample Input2 1 100.00 3 100.00 4 210.00原创 2015-03-30 20:14:38 · 980 阅读 · 0 评论 -
浅谈并查集
在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。这一类问题近几年来反复出现在信息学的国际国内赛题中,其特点是看似并不复杂,但数据量极大,若用正常的数据结构来描述的话,往往在空间上过大,计算机无法承受;即使在空间上勉强通过,运行的时间复杂度也极高,根本就不可能在比赛规定的运行时间(原创 2015-04-01 14:07:28 · 595 阅读 · 0 评论 -
算法题汇总
1)整数划分问题百度百科搜索 整数划分,可以看到最好的解释和代码:整数划分2)全排列问题递归实现:递归实现非递归实现:非递归实现原创 2016-01-31 21:56:28 · 593 阅读 · 0 评论 -
Leetcode解题思路总结(Easy)
近来走上了Leetcode刷题之路,不过刷题背后更重要的是思路,掌握了方法,举一反三融会贯通。故在此我总结每道题的解题思路,按照题目从简单到难的顺序来列举。292 Nim Game,传说中的一行代码搞定。属于很简单的博弈推理。思路:假如只有1~3个石头,那我方肯定能赢,假若有4个石头,无论我取1~3个石头,对方总是能拿下最后一个石头,所以这时候我方必输。假若有5~7个石头,我能取对原创 2015-12-17 17:12:03 · 9690 阅读 · 1 评论 -
Leetcode解题思路总结(Medium)
136. Single Number思路:一个数组中,每个数字都出现了2次,只有一个数字出现了1次,要求找到那个数。我一开始想到的方法是用扫描数组添加到set中,如果出现了2次就从set中erase掉,扫面完后set中唯一一个元素就是我们需要的返回值,写完代码AC结果发现要84ms,超级慢。原创 2016-02-15 15:37:14 · 3324 阅读 · 0 评论 -
LintCode链表题总结
由于链表本身结构的单一性,链表的题目很少会有很大的变种,基本都是围绕几个基本的考点出题目。所以链表的题目比较好掌握,但是链表的题目又不太容易一次就AC通过,由于边界情况未考虑、空指针(比如head.next不存在但是却给head.next赋值了,就会抛出nullpointer的错误)、越界等边界情况,我们需要在测试用例的时候多考虑边界条件。在模拟计算的时候一定要用纸和笔把中间的操作过程给画出来,这原创 2016-06-01 14:08:25 · 4531 阅读 · 0 评论 -
LintCode位运算题总结
LintCode上位运算&二进制的题目不多,加起来就10道题左右,把他们全部都AC一下,位运算这块就差不多了。面试的时候位运算也不是经常考察的点。因为这东西你知道就指导,不知道就不知道,没有啥深入探究讨论的余地。1. A + B Problem对两个32位的整数求和,这道题要是直接回答return A + B那就只能等着收拒信了。这道题考查的是会不会用位运算做加法,如果用位运算的话,运行时原创 2016-08-02 13:16:59 · 944 阅读 · 0 评论 -
LintCode二叉树&递归分治题总结
LintCode中二叉树与分治法那章有这么些题目:376. Binary Tree Path Sum原创 2016-07-26 23:53:30 · 4031 阅读 · 2 评论