算法
文章平均质量分 59
souldak
爱工作爱生活
展开
-
单链表面试题总结
假设单链表节点为struct node{ int data; struct node* next;}链表名为list,已知头结点为head一. 单链表反转1. pre-cur-next法,最常用的方法2.原创 2011-10-07 19:49:58 · 164 阅读 · 0 评论 -
找与一个数二进制表示1的个数相同的相邻的两个数
所谓相邻,就是说所有这样的书排序好之后相邻,也就是满足条件的大于它的最小的数和满足条件的小于他的最大的数大于它的最小的数:从右往左,找到第一个右边有1的0, 将0,1互换,最后将这个位置后面的1全部挪到最后面11001100->11010100->11010001小于它的最大的数:从右往左,找到第一个右边有0的1, 将0,1互换,然后再将这个位置右边所有的1尽可能的忘左原创 2013-09-04 23:46:09 · 1954 阅读 · 0 评论 -
上一篇括号配对让人联想起catalan数,顺便转载一篇归纳的还不错的文章
问题描述:卡塔兰数,是组合数学中一个常出现在各种计数问题中出现的数列。输入一个整数n,计算h(n)。其递归式如下:h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (其中n>=2,h(0) = h(1) = 1) 该递推关系的解为:h(n)=C(2n,n)/(n+1) (n=1,2,3,...) 思路:直接根据递归式,转载 2013-09-12 20:28:38 · 1620 阅读 · 0 评论 -
输出n对括号的可能组合
转载请注明来自souldak,微博:@evagle怎么样才是合法的组合?只要每一时刻保证左括号的数目>=右括号的数目即可。直接递归就行,每次递归加一个括号,左括号只要还有就能加,右括号要保证加进去之后右括号总数不大于左括号总数void insert_parentheses(char *res, int l, int r){ if(l==0&&r==0)原创 2013-09-12 20:21:42 · 2126 阅读 · 0 评论 -
用容量为3和5的容器量出4单位的水
先装满3的容器,倒到5里头,然后再装满3,倒5里头,3里面剩下1,然后5倒掉,1单位倒到5里头,3再装满倒5里头OK 5里面装了4 单位的水原创 2013-09-05 22:37:45 · 1340 阅读 · 0 评论 -
经典8皇后问题,仅仅做个记录吧
转载请注明来自souldak,微博:@evagle经典的8皇后问题,一下代码只是思路的框架,有些函数没具体实现,可以尝试自己动手哦,亲!void queens(char** board, int step){ if(step==8) print_board(); for(int i=0;i board[step][i] =原创 2013-09-12 23:00:10 · 1152 阅读 · 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 · 16115 阅读 · 1 评论 -
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 · 2039 阅读 · 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 · 1960 阅读 · 0 评论 -
Sorting
转载请注明来自souldak,微博:@evagle这是Google of Greater China Test for New Grads of 2014 Round A 第3题,题目:Sorting这题最简单,要求奇数和偶数分开排序,排序后奇数还是只能在原来是奇数的那些位置,偶数还是只能在原来是偶数的那些位置。奇数升序,偶数降序。最简单的做法:将奇数和偶数分开到两个数组奇数递原创 2013-09-26 13:00:28 · 1487 阅读 · 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 · 240 阅读 · 0 评论 -
leetcode Single Number II
转载请注明来自souldak,微博:@evagleSingle Number 比较简单,直接异或即可。这题除了一个数只有一个,其他的都有三个,不能直接异或了。但是本质上道理是相同的,其他数有两个的时候,用异或将这个数消除,那现在就得想办法将三个数消除。先简单来看,如果只有3个1,用ones记录MOD3之后为一的,twos记录MOD3之后余2的情况,threes 是MOD3=0原创 2014-03-11 17:01:27 · 3780 阅读 · 0 评论 -
0..n去掉一个数,给你剩下的数,找出去掉的那个数
转载请注明转自blog.csdn.net/souldak , 微博@evagle 首先,考虑没有去掉那些数,如果n是奇数,n+1个最低位肯定是0101...01,count(0)=count(1),如果n是偶数,0101...010那么0要比1多一个,count(0)=count(1)+1例子n=40=00 1=01 2=10 3=11 4=100,最低位有3个02个1,原创 2013-09-05 00:16:13 · 1750 阅读 · 0 评论 -
给定一个未排序数组, 找出其中最长的等差数列
转载请注明来自souldak,微博:@evagle题目如题所诉:其实就是前面那篇leetcode 最长连续序列 longest consecutive sequence的升级版leetcode上的题目是要求等差为1,即连续序列,而现在把等差为1的限制条件去掉,找最长的等差数列,做法和复杂度却升级了。现在给出一个O(n^2)的算法:算法思路:先排序,O原创 2013-09-11 09:29:48 · 6392 阅读 · 0 评论 -
奇思妙想:删除单链表的一个节点
Cracking the Coding Interview 中的一个题目,非常巧妙:Implement an algorithm to delete a node in the middle of a single linked list, givenonly access to that nodeEXAMPLEInput: the node ‘c’ from the li原创 2013-08-27 14:08:46 · 1057 阅读 · 0 评论 -
算法中的基础几何知识-叉积,线段,点
1. 叉积(wikipedia):两个向量的叉积是 ,表示两个向量组成的平行四边形的面积, a(x1, y1) X b(x2, y2) = x1y2 – y1x22. 点是否在线段上。先判断是否三点共线:假设判断点p是否在线段e(u,v), p,u,v 是三个点。首先构造pu,pv 向量,然后pu和pv的叉积为0,因为这是因为三点共线的话这两个向量夹角为0,所以叉积为0.原创 2013-08-27 16:32:28 · 1159 阅读 · 0 评论 -
topcoder SRM144 DV1 550 解析
最难的一个是1~m共m个数,放到n个格子里,可重复但要排序的方法总数。这是一个组合数学题目。 题解: 假设1~m各选了x1,x2,...xn个,xi>=0. 那么x1+x2+....+xm = n. 再变换一下,令yi= xi +1 : y1+y2+...ym = m+n ; yi >0 这样的话就可以有两种思路求解了。原创 2013-08-28 15:56:31 · 1872 阅读 · 0 评论 -
leetcode解析回文子串拆分
转载请注明来自souldak,微博:@evagleGiven a string s, partition s such that every substring of the partition is a palindrome.Return all possible palindrome partitioning of s.For example, given s = "aab",原创 2013-09-06 20:28:36 · 2143 阅读 · 0 评论 -
leetcode回文子串拆分-最小拆分次数
转载请注明来自souldak,微博:@evagle上一篇是要输出所有的可能拆分,这回是要输出拆分次数最少的切割次数。如果直接按照上一篇那么做的话,就会超时,因为我们在判断s[i][j]是否是回文的时候做了很多的无用功,每一个s[i][j]都用字符串计算了一遍,然而实际上可以根据s[i+1][j+1]推算出来的。题目。代码如下/** * @file Palindrome_P原创 2013-09-06 20:38:27 · 1777 阅读 · 0 评论 -
leetcode Surrounded Regions 详解
转载请注明来自souldak,微博:@evagle其实这道题非常思路简单,bfs或者dfs找到所有连在一起的O,如果这些O中有一个挨着边,那就不变,否则就是被surrounded的,全部变成X就行但是很久没写bfs导致了入队的时候没有判重,导致了大量的点入队超过1次。所以Large dataset时就TLE了。判重之后轻松通过,64ms。不多说了,直接上代码:/** *原创 2013-09-07 14:40:51 · 15558 阅读 · 0 评论 -
leetcode Sum Root to Leaf Numbers(所有路径之和)
转载请注明来自souldak,微博:@evagle观察题目给的返回值类型是int,可以断定这棵树的高度不会超过10,所以数据量其实是非常小的。那就直接dfs遍历这棵树,然后到叶子节点的时候将值加到最终结果上就OK了。思路非常之简单就不详述了。直接上代码:class Solution { public: int sumNumbers(Tr原创 2013-09-08 21:59:20 · 2260 阅读 · 0 评论 -
leetcode 最长连续序列 longest consecutive sequence
转载请注明来自souldak,微博:@evagle题目(来自leetcode):给你一个n个数的乱序序列,O(N)找出其中最长的连续序列的长度。例如给你[100, 4, 200, 1, 3, 2],那么最长的连续序列为[1, 2, 3, 4],所以返回4。思路:最简单直接的想法是:将数组排序,然后扫一遍排好序的序列,从中找出最长的即可,这样的话时间是O(nlogn)+O(n原创 2013-09-09 12:01:08 · 10166 阅读 · 6 评论 -
十进制字符串转成二进制(decimal to binary)
题目:给一个十进制的字符串例如1.25, 将其转化为二进制字符串,这个例子的结果是1.01 = 1*2^0 + 0*2^(-1) + 1*2^(-2) = 1.25。 如果不能完整的用二进制表示,输出ERROR思路:首先整数部分和小数部分的做法不同,需要区分开。先说整数部分,假设整数部分是n:这个很简单,不断的对2取余然后数除2就行。例如5转成二进制:n=13n%2 = 1原创 2013-09-02 12:45:35 · 4588 阅读 · 0 评论 -
SRM589 DV1 250 回文字符串
其实这道题挺简单的,不过刚开始我钻了一个错误的死胡同。想明白之后才发现。 题目要求用最少的时间来将一个字符串变成回文字符串。(具体题目参看topcoder srm589 DV1 250分值的题目,不便公开以免影响后面做题的人)首先对于(i,j),如果i=n-1-j, 那它们所代表的位置的字符最终必须相等,否则就不是回文了。S[i]=S[j]; 如果源字符串S中,S[i]=S[j]原创 2013-09-03 11:51:14 · 1338 阅读 · 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 · 5398 阅读 · 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 · 2657 阅读 · 0 评论 -
leetcode two sum
Two Sum [ sourcecode | problem ]这个题目看上去很简单,就是在一堆数里面找两个数,使得他们的和为给定的值。但是,其实这个题目要求比较高,而且坑很多。首先如果想要AC,普通的暴力枚举是不行的,因为时间复杂度是O(n^2)。那还有两种方法:先排序,O(nlgn),然后遍历每个元素v,计算target-v,然后二分搜索target-v,不过因为需原创 2014-12-08 14:14:52 · 1243 阅读 · 0 评论