
Algorithms
文章平均质量分 64
li4951
这个作者很懒,什么都没留下…
展开
-
如何两个栈实现队列?两个队列实现栈?
初看此题目,你可能觉得自找苦吃,队列就队列为什么要用栈来实现,工程中总是很典型的应用,直接调API就可以了,不管是什么语言,已经有现成API封装好队列以及堆栈的所有操作。没错,在项目中很少有这样的需要。但是我们是站在学习的角度,并不是画地为牢,难为自己,而是对思维的一种锻炼,对算法的提升么。我们在面试的时候碰到的这类问题还少吗?所以大家就不要拍砖了。现在开始研究此问题。首先看如何用两个栈去原创 2011-11-20 13:05:43 · 8419 阅读 · 0 评论 -
T9输入法的实现
T9输入法,名字听起来陌生,可是大家却经常使用它。可以说T9输入法是输入法历史中的一次革命。至少自T9输入法开始,输入法有长足的进步。如图手机中九个数字键。26个英文字母被分配到2至9这8个数字键上。以前想输入英文单词的时候总是需要连续多次按某个键,才能得到目标字母。比如想输入“hello”,就需要按两次4,两次3,三次5,三次5,三次6.输入一个单词需要数十次的按键,更何况还有经常按错的情况原创 2012-03-30 11:11:04 · 7663 阅读 · 6 评论 -
DFS解素数环问题
问题描述: 将从1到n这n个整数围成一个圆环,若其中任意2个相邻的数字相加,结果均为素数,那么这个环就成为素数环。 算法描述:典型深搜问题。 代码:#includeusing namespace std;int N = 0;int data[30] = {0};bool not_contain(int num, int depth){ f原创 2012-04-08 20:27:18 · 1508 阅读 · 0 评论 -
编程之美——小飞的电梯调度算法之新解
亚洲微软研究院所在的希格玛大厦一共有6部电梯。在高峰时间,每层都有人上下,电梯每层都停。实习生小飞常常会被每层都停的电梯弄的很不耐烦,于是他提出了这样一个办法:由于楼层并不算太高,那么在繁忙的上下班时间,每次电梯从一层往上走时,我们只允许电梯停在其中的某一层。所有乘客从一楼上电梯,到达某层后,电梯停下来,所有乘客再从这里爬楼梯到自己的目的层。在一楼的时候,每个乘客选择自己的目的层,电梯则计算出原创 2012-04-22 10:56:39 · 5558 阅读 · 8 评论 -
有限域中的乘法逆元
在密码学和安全领域有限域的应用很广。包括大家熟知的欧几里得算法求最大公因子。本文介绍在有限域中求乘法逆元。包括对于整数和多项式的。利用了扩展的Euclid算法。有伟大的高德纳提出。1. 乘法逆元w' :任意的w属于Zp, w!=0,存在z属于Zp使得w*z==1 (mod p);举例如下:求5关于mod 14 的乘法逆元。5*3 == 1 (mod 14);所以5的模14乘法逆元为原创 2012-06-28 15:21:23 · 16558 阅读 · 2 评论 -
再次理解DFS(POJ1014)
原题目:http://poj.org/problem?id=1014题目大意:有分别价值为1,2,3,4,5,6的6种物品,输入6个数字,表示相应价值的物品的数量,问一下能不能将物品分成两份,是两份的总价值相等,其中一个物品不能切开,只能分给其中的某一方,当输入六个0是(即没有物品了),这程序结束,总物品的总个数不超过20000 输出:每个测试用例占三行:原创 2012-04-07 10:33:14 · 4826 阅读 · 18 评论 -
递归,迭代还是其他?
1.问题描述:(1)一只青蛙一次可以跳上1 级台阶,也可以跳上2 级。求该青蛙跳上一个n 级的台阶总共有多少种跳法。(2)一只青蛙一次可以跳上1级台阶,也可以跳上2 级……它也可以跳上n 级,此时该青蛙跳上一个n级的台阶总共有多少种跳法?2.递归:在递归里面,一个子程序自己负责解决摸个问题的一小部分,他还把问题分解成很多的小块,然后调用自己来分别解决每一小块。当问题的小部分很容易解原创 2011-12-27 21:15:56 · 981 阅读 · 2 评论 -
AOV网与拓扑排序
一.概念在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系,成这样的有向图为顶点表示活动的网,简称AOV网(activity on vertex network)。最典型的例子是课程与课程之间的优先关系。若某个AOV网中所有顶点都在拓扑序列中,说明该AOV网不存在回路。一个AOV网的拓扑序列可能不唯一。对AOV网进行拓扑排序的基本思想是:(1)从AOV网中选择一个原创 2012-11-13 10:10:37 · 9563 阅读 · 0 评论 -
leetcode: 2Sum/3Sum/3SumClosest/4Sum系列问题
leetcode(http://leetcode.com/onlinejudge)上有好几道关于数组中几个数据和为target的题目。恰好正在看剑指offer中“和为s的两个数组这章”,据此思想,leetcode上的三道题目都被我解决了。总结一下。1.twoSum:输入一个递增数组和一个数字s,在数组中查找两个数使得它们的和正好是s。既然题目中已经提到了“递增数组”,那么肯定不会暴力了。因原创 2013-03-19 19:49:15 · 10940 阅读 · 3 评论 -
全排列的生成
前两种是字典序,第三种非字典序。方法一:组合数学方法 (总结规律,得出结论,偏向数学)顾名思义,这种方法的思想就是将所有的n元排列按“字典顺序”排成队,以12…n为第一个排列,排序的规则,也就是有一个排列(p)=(p1p2p3…pn)直接生成下一个排列的算法可归结为:(1)求满足关系式p(k-1)(2)求满足关系式p(i-1)(3)p(i-1)与p(j)互换位置得q=(q1q2原创 2012-04-06 16:23:53 · 2870 阅读 · 0 评论 -
POJ2513 Trie+并查集+欧拉回路
题目大意:给定一系列sticks,每个木棒的两端都涂有颜色,判断是否能够找到将所有的木棒连接起来的方法,使相互连接的木棒的两端的颜色是相同的?分析:画图分析可知,如果形成的图能有一条路径遍历所有的边并且不重复。则达到目的。不由想起欧拉回路(从某个节点出发,不重复的遍历所有路径,回到原点,则为此图的欧拉回路)。而本题中并不要求回到原点。没有欧拉回路要求的苛刻。判断无向图是否有欧拉回路的方原创 2012-04-10 15:19:40 · 3975 阅读 · 0 评论 -
三分搜索法
一 问题在一个平面上有N个点,每个点的坐标已经给出,现在要求在X轴上找一个点,使得这个点到所有点中最大的距离最小。二 分析不知道是否有基于策略选择的算法,也许是DP也许是Greedy。本文通过数值计算来解决此问题。问题抽象:设f(x) = max(node1_distance, node2_distance, ……nodeN_distance), a求x*使min(原创 2013-04-15 10:19:28 · 2589 阅读 · 0 评论 -
海量数据处理之bitmap实现
bitMap位图经常用来处理海量数据的问题,如3亿微信号和7亿QQ查重问题,电话号码去重问题,都可以用位图法来处理。位图法思想较简单,即申请一个由比特构成的table,可在相应的位置置0或1.从而快速达到快速查找,同时又不会特别浪费空间。网上关于位图法的详细解释比较多。本文主要给出一个位图法简单的实现。typedef char byte8;typedef byte8 * bitMap;原创 2013-05-08 20:23:20 · 2017 阅读 · 0 评论 -
求所有的出栈序列
之前我们谈到验证一个出栈序列是否合法比较容易,简单模拟入栈出栈过程即可。那么如果需要求出所有合法的出栈序列该怎么办呢?(1)我们之前谈到,合法的出栈序列条件:对于每个已出栈数之后的且小于此数的数都必须按降序排列。例如1 2 5 3 4。对于5来说,后面的3,4都小于5,可是3,4却是升序的。则肯定不是合法的出栈序列。由此可以想到我们可以求出所有的全排列,然后从中剔除掉非法序列。显然,当原创 2012-03-08 18:05:39 · 5617 阅读 · 3 评论 -
POJ1363验证出栈序列问题
题目地址: http://poj.org/problem?id=1363此题只需验证是否为合法的出栈序列。有两个思路:1、每个已出栈之后的数且小于此数的数都必须按降序排列。复杂度O(n^2),适合人脑。2、另一个思路就是直接模拟入栈出栈过程。虽然模拟毫无技巧可言,但复杂度O(n),优于算法1。适合电脑。代码如下:for(i = 0; i < N; i++){ if(in原创 2012-02-29 16:55:56 · 2007 阅读 · 4 评论 -
记忆化递归
POJ 1579有感。递归是一个非常耗时的操作,递归思想简单,其实是将繁重的任务交给计算机来完成。计算机来记住某个时候的状态,转身去处理新的问题,也就是利用堆栈的原理。频繁的压栈和出栈将耗费大量的计算机资源。例如著名的汉诺塔。在某些递归模型中例如1579,递归过程中可能蕴含之前已经解决过的问题,所以我们完全可以没处理一个新的小问题时,就把这个小问题的结果保存下来。以备后用。这就是记忆化递归!非原创 2011-09-24 10:00:18 · 1985 阅读 · 0 评论 -
POJ1523求割点
1.概念 所谓割点就是将图中的某点去掉后图变得不连通。这个点就是割点。另外还有割点集的概念同理。就是将这个集合中的点都去掉后图变得不连通,但去掉它的任意子集都不会影响连通性。2.解决方案遍历图中的每个点,将其去掉后,判断图的连通性。当然图的连通性算法就不再阐述了(对所有的点进行深(广)度优先遍历……)原创 2011-10-12 08:41:16 · 623 阅读 · 0 评论 -
POJ1050总结 二分+判定
#includeusing namespace std;#define inf 100000000const int MAX = 505;int data[MAX];int isPart[MAX];int M;int K;int calculatePart(int size){ memset(isPart, 0, sizeof(isPart)); int i = M - 1原创 2011-10-09 17:55:51 · 598 阅读 · 0 评论 -
编程之美 3.2电话号码对应英语单词
原始问题如下:手机上面的数字键均对应了几个字符,譬如2对应了a,b,c。问题是当输入一段数字后,求出所有可能的字符组合,(可以想象一下发短信时候的状况,每当按几个数字键后,均给出可能的汉语拼音,当然这个要求就更高了,本题只要求给出所有可能的组合)。举个例子输入4,2键后,则给出GA,GB,GC,HA,HB,HC,IA,IB,IC组合。当然对于大多数人来说就是几层循环就搞定了,每层遍历,内部原创 2011-11-06 09:30:19 · 2271 阅读 · 0 评论 -
编程之美2.16 最长上升子序列
如何求一个一维数组(N个元素)中最长递增子序列?例如给定序列1-1,2,-3,4,-5,6,,-7,其中最长递增子序列的长度为4(如1,2,4,6)。经典解法:也是传统解法,动态规划,每加入一个新的数字,则检查是否和前面所记录的序列能组成更长序列。示例如下:扫描序列 1 -1 2 -3 4 ……记录序列最大值 1 -1 2 1 4 ……记录序列长度 1原创 2011-11-06 09:37:58 · 909 阅读 · 2 评论 -
编程之美2.3 寻找发帖“水王”
扩展问题:找出有3个发帖很多的ID,他们的发帖数目都超过了总数目N的1/4.你能从发帖ID列表中快速找出他们的ID吗?#includeusing namespace std;void find(int id[], int N){ int box[4]; int count[4]; memset(count, 0, sizeof(count)); int i原创 2011-11-06 09:39:15 · 2747 阅读 · 0 评论 -
经典冒泡排序,你写对了吗?
冒泡排序可是排序入门级别的排序算法了。算法比较简单,可是观察周围科班出身的学生或者应聘者,能将这一简单排序算法正确完整的写出来的真的不多。据调查,出一道题给20个印度程序员写代码,结果基本一样,而中国的程序员的结果却五花八门。这点对大型软件设计效率的提高非常不利。现在就给出经典冒泡排序的正确写法,看看与你写的有什么不同?孰胜孰劣?void bubbleSort(int array[], int原创 2011-11-06 09:40:37 · 1745 阅读 · 3 评论 -
实现链表逆序
今天听课的时候突然提到一个问题,如何把链表逆序,考虑一下,简单指针操作即可。 #includeusing namespace std;struct node{ int data; node* next;};class LinkedList{public: LinkedList() { first = new node; int i =原创 2011-11-06 11:33:53 · 755 阅读 · 0 评论 -
由windows的Alt+Tab键联想到的数据结构
对windows的快捷键比较熟悉的人应该用过Alt+Tab吧。可以方便的切换各个任务程序。在win7下的效果更炫一点。按住Alt键不放,然后敲击Tab键,即可预览各个任务界面,以及切换到各个程序界面。那么这是如何实现的后台数据结构是如何设计的。首先应该认真观察切换效果,假设有任务A,B,C,D,E。(1)切换一次后变成B,A,C,D,E.在切换一次后又是A,B,C,D,E。(2)切原创 2011-11-13 12:04:22 · 1826 阅读 · 2 评论 -
面试题——二维数组中的查找
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 例如下面的二维数组就是每行、每列都递增排序。如果在这个数组中查找数字7,则返回true;如果查找数字5,由于数组不含有该数字,则返回false。这是前两天解决的一个问题,写出来总结一下。递归函数如下原创 2011-12-27 13:44:55 · 2303 阅读 · 0 评论 -
XDOJ最喜欢的数字
Description zyf最喜欢的数字是1!所以他经常会使用一些手段,把一些非1的数字变成1,并为此得意不已。他会且仅会的两种手段是:1.把某个数m除以某个质数p——当然p必须能整除这个数,即m=m/p 2.把某个数m减1,即m=m-1 有一天他突发奇想,想把[a,b]区间中所有的数一个一个地变成1,这是一个巨大的无聊的工程,所以他想知道他最少得花多少操原创 2012-02-23 15:47:34 · 2653 阅读 · 0 评论 -
快速幂的应用
一个非常平常的公式:x^n = (x^(n/2))^2 (n为偶数)x^n = (x^((n-1)/2))^2 * x (n为偶数)这两个公式初中应该就学了。可是似乎他一直没发挥什么作用。事实上他在计算机科学中的作用甚大。可以观察等号左侧的式子对于计算机来说需要计算n-1次乘法,而对于右边的式子只进行了约n/2+1次乘法。这个差别对于计算机来说是巨大的。而且右边的式子中的幂运算还可以进原创 2012-02-23 16:12:33 · 828 阅读 · 0 评论 -
屏蔽敏感词汇&KMP
在互联网上,由于一些政策法规,需要对一些帖子或者聊天记录进行关键字屏蔽,本文使用KMP模式匹配算法,将目标串S中的敏感词汇全部替换成*。实际应用中需要一个屏蔽词库,需将每个屏蔽词条作为模式串T,分别过滤一次S串。考虑到屏蔽词库中有相同前缀的屏蔽词,比如:“朱令”和“朱令案”,所以可以预先将屏蔽词库中的屏蔽词按照长度做由大到小的排序。先过滤长词,再过滤短词即可。int getNext(c原创 2013-05-23 09:49:58 · 5064 阅读 · 0 评论