算法ABC
文章平均质量分 59
主要是包括interview涉及的算法,比如cracking the coding interview,programming interview exposed等面试书籍topcoder,leetcode等算法网站上的题目,以及一些经典算法分析。
souldak
爱工作爱生活
展开
-
leetcode two sum
Two Sum [ sourcecode | problem ]这个题目看上去很简单,就是在一堆数里面找两个数,使得他们的和为给定的值。但是,其实这个题目要求比较高,而且坑很多。首先如果想要AC,普通的暴力枚举是不行的,因为时间复杂度是O(n^2)。那还有两种方法:先排序,O(nlgn),然后遍历每个元素v,计算target-v,然后二分搜索target-v,不过因为需原创 2014-12-08 14:14:52 · 1238 阅读 · 0 评论 -
再谈KMP算法
这回思路要更清晰了。目标串T:ababzabcd模式串P:ababx关键是在z和x不相等的时候,P应该往前移动多少个。或者说,哪哪个字符和当前的z比较。很明显,x之前的字符串abab肯定和z之前的都相同,那我们只需要研究abab就行了。先放好abab,然后用abab从后往前比较,看看最多能往前移动多少能够匹配,例如:1. abab abab2.aba原创 2013-12-07 14:25:17 · 234 阅读 · 0 评论 -
将数组分成两部分使得两部分的和的差最小
题目有点拗口,举个例子,有1,2,3一共3个数,将这三个数分成两部分,有3种分法1 | 2,3或者1,2| 3 或者1,3|2,然后计算每部分所有数的和,1 | 2,3 -> 和为1,5,和的差是41 2| 3 -> 和为3,3,和的差是01 3|2 -> 和为4,2,和的差是2所以按照1,2| 3分得到的和的差最小。那么任意给定一个数组,如何找出最小值呢?思路:差原创 2013-10-06 18:22:12 · 16079 阅读 · 1 评论 -
Sorting
转载请注明来自souldak,微博:@evagle这是Google of Greater China Test for New Grads of 2014 Round A 第3题,题目:Sorting这题最简单,要求奇数和偶数分开排序,排序后奇数还是只能在原来是奇数的那些位置,偶数还是只能在原来是偶数的那些位置。奇数升序,偶数降序。最简单的做法:将奇数和偶数分开到两个数组奇数递原创 2013-09-26 13:00:28 · 1484 阅读 · 0 评论 -
Rational Number Tree
转载请注明来自souldak,微博:@evagleGoogle of Greater China Test for New Grads of 2014 Round A 第一题,题目: Rational Number Tree如下面这颗树,生成规则是,左儿子的分子和父节点一样,分母是父节点分子分母之和,右儿子的分母和父节点一样,分子是父节点分子分母之和。这个数按层遍历得到一个序列原创 2013-09-26 12:51:15 · 1951 阅读 · 0 评论 -
Read Phone Number
这是Google of Greater China Test for New Grads of 2014 Round A 第一题,题目: Read Phone NumberSampleInput 315012233444 3-4-415012233444 3-3-512223 2-3Output原创 2013-09-26 12:16:50 · 2035 阅读 · 0 评论 -
C/C++中char* 与char []定义的区别
转载请注明来自souldak,微博:@evagleC/C++初学者很可能会以为这两个是一样的,其实如果不需要去修改字符串的话,那它们的效果的确是一样的。那它们的区别到底在哪儿呢?char* s1="abc"; s1是一个指针,这个指针可以被修改,它可以指向新的地址。现在它指向的是字符串常量“abc”,字符串常量存储在constant section里,不可被修改。char s2原创 2013-09-10 17:07:33 · 19075 阅读 · 0 评论 -
给定一个字符串,输出其所有的可能排列
转载请注明来自souldak,微博:@evagleQuestion:给你一个字符串例如abb输出它包含的字符的所有可能排列。例如abb输出3个:abb,bab,bbaAnswer:假设我们自己来做,那做法如下:1. 有n个字符相当于n个格子。2. 先放第一个格子,从n个字符中任选一个,放到这个格子即可,放完就剩下n-1个格子和n-1个字符3. 放第二个格子,从n-1原创 2013-09-10 17:10:33 · 5390 阅读 · 0 评论 -
给定一个未排序数组, 找出其中最长的等差数列
转载请注明来自souldak,微博:@evagle题目如题所诉:其实就是前面那篇leetcode 最长连续序列 longest consecutive sequence的升级版leetcode上的题目是要求等差为1,即连续序列,而现在把等差为1的限制条件去掉,找最长的等差数列,做法和复杂度却升级了。现在给出一个O(n^2)的算法:算法思路:先排序,O原创 2013-09-11 09:29:48 · 6388 阅读 · 0 评论 -
O(n)和O(1)时间对数组进行排序
转载请注明来自souldak,微博:@evagle题目:给你一个待排序数组,有正有负,要求在O(n)时间和O(1)空间内将数组中的负数放在整数前面,但是负数之间的顺序不变,正数间的顺序也不变(即要求是stable的排序)。例如 -1 1 3 -2 2排序后是-1 -2 1 3 2.第一想法是quick sort 的partition方法,它可以实现O(n)的时间和O(1)的空间原创 2013-09-11 09:39:28 · 2654 阅读 · 0 评论 -
输出n对括号的可能组合
转载请注明来自souldak,微博:@evagle怎么样才是合法的组合?只要每一时刻保证左括号的数目>=右括号的数目即可。直接递归就行,每次递归加一个括号,左括号只要还有就能加,右括号要保证加进去之后右括号总数不大于左括号总数void insert_parentheses(char *res, int l, int r){ if(l==0&&r==0)原创 2013-09-12 20:21:42 · 2122 阅读 · 0 评论