
算法设计
文章平均质量分 69
沈三水
这个作者很懒,什么都没留下…
展开
-
Euler's Totient Function(欧拉函数)
定义欧拉函数ϕ(n)=count(p),p∈[1,n] AND gcd(p,n)=1\phi(n)=count(p),p\in[1,n]\ \mathrm{AND} \ gcd(p,n)=1,其中count(p)count(p)表示满足上述条件pp的数目。公式ϕ(n)=n∏p|n(1−1p)\phi(n)=n\prod_{p|n}(1-\dfrac{1}{p}) 其中,pp是nn的质因子(nn能原创 2015-11-25 12:03:47 · 1211 阅读 · 0 评论 -
Beautiful Array
题目大意:一组整数AA,数组大小为NN。如果数组中所有元素相等,那么该数组称为“完美数组”(Beautiful Array)。现在给你一个“不完美”数组AA,并且你可以进行下面两种操作: 1. 选择不同的两个元素Ai,AjA_i,A_j,其中i≠j,1≤i,j≤Ni\neq j, 1 \leq i,j\leq N。对一个+1+1,对另一个−1-1(不分先后)。花费:kk元。 2. 选择一个元素A原创 2015-10-19 08:38:08 · 1282 阅读 · 0 评论 -
Find the Duplicate Number
Find the Duplicate Number(寻找重复数)问题定义给定一个数组AA,大小为N+1N+1,且所有元素均来自前NN个自然数(1,2...,N)(1,2...,N)。显然,必然存在一个元素Ai∈(1,2,...N)A_i\in (1,2,...N)出现两次以上,且我们规定有且只有一个元素出现两次以上。下面在分析时,将数组元素全部减一,方便描述和理解。要求: 1. 不可改变数组AA的原创 2015-09-30 20:25:42 · 490 阅读 · 0 评论 -
减小数组
转载网址:http://www.geeksforgeeks.org/find-minimum-possible-size-of-array-with-given-rules-for-removal/Find minimum possible size of array with given rules for removing elementsGiven an array of转载 2015-10-16 20:45:50 · 444 阅读 · 0 评论 -
范围最大异或值
题目大意:给定范围 L题目连接:https://www.hackerrank.com/challenges/maximizing-xor题目解析:思路一: 如果问题的规模(R-L)很小的话,那么两层循环枚举所有情况是不错的解决方案。思路二: 如果问题的规模(R-L)较大,那么暴力枚举失效。这里给出位操作的方法,过程如下: 设原创 2015-09-12 11:05:57 · 1227 阅读 · 0 评论 -
codility minAveTwoSlice
题目网址:https://codility.com/programmers/lessons/3题目大意:求一个数组中连续子段的最小平均值所对应的段落开始的下标,且下标最小(因为存在多种最小平均值的可能)。另外,输入数组的元素个数最小为2题目分析:刚看到题目的第一反应是“两个指针”的思路,但是在分析后发现,没有明显地升降规律。于是,考虑网上的答案,有如下面的解法。原创 2015-08-07 16:25:40 · 417 阅读 · 0 评论 -
AVL平衡树
AVL平衡树是一种二叉搜索树,且每个节点保持平衡。节点平衡的标准是节点的左右子树高度的差属于[-1, 0, 1]之一。另外,树的高度等于从根结点到最深叶子节点的步数。特别地,root=NULL,高度=-1;叶子节点的高度等于0。如果树种某节点不满足节点的平衡标准,那么需要对不满足标准的节点进行旋转。总共分四类:left-left,left-right,rig原创 2015-08-30 21:54:49 · 434 阅读 · 0 评论 -
如何评价全栈工程师
下面这篇文章属于转载,先给出出处:http://www.youkuaiyun.com/article/2014-01-21/2818203-Full-Stack-Engineer读过之后,最深刻的感觉是全栈工程师不应该被简单理解成一种职位,或者说把它只当做IT技术大拿是片面的。全站工程师更多体现的是一种精神,一种做成一件事,实现自己脑海中的那个梦想的时,你全力以赴的冲劲。所以,应该给自转载 2015-05-24 22:26:52 · 948 阅读 · 0 评论 -
POJ 1979
题目:http://poj.org/problem?id=1979解题方法:深度优先算法注意问题:字符输入时,回车键也会被当做有效字符输入,所以影响整体的输入。解决方法:在scanf的一开始加上\n,其作用是刷新输入流的内容,保证之前留下的回车键不影响后面正确字符的输入。代码如下:#includeconst int HMAX = 20;const int WMAX原创 2015-05-19 23:54:50 · 530 阅读 · 0 评论 -
POJ 2393 Yogurt factory
题目连接:http://poj.org/problem?id=2393题目大意: 酸奶工厂需要生产酸奶,共N周。同时,酸奶每周单位重量的价格Price不一样,且每周的需求量needs也不同,但是可以存储酸奶(一周生产多周的酸奶)且不考虑腐败的情况,存储酸奶的价格是每周每单位重量酸奶需花费S,即本周生产的酸奶多于本周的需求,则需要花钱存储起来。问:最低成本是多少?原创 2015-06-01 16:17:46 · 633 阅读 · 0 评论 -
POJ 1703
题目链接:http://poj.org/problem?id=1703题目大意:两组犯罪团体,抓住N个人,他们属于且唯一属于两组犯罪团体之一。然后,给你M条信息,也分两类。D类信息说明id0和id1是不同组织的,A类信息是询问id0和id1的关系,包括不同组织,相同组织和无法判断。解题思路: 并查集,但简单并查集思路与该题目不符合。因为简单并查集会告诉你两个目标是相原创 2015-06-21 15:10:28 · 459 阅读 · 0 评论 -
Basic Binary Indexed Tree
Advantages of BIT: - Use less memory than RMQ - Easy to code - Can be used in many problems about number sequence - Runtime: O(logN)转载 2015-10-18 12:18:04 · 342 阅读 · 0 评论 -
检测一个数组能否表示二叉搜索树(BST)的先序遍历
GeeksforGeeks的文章: http://www.geeksforgeeks.org/check-if-a-given-array-can-represent-preorder-traversal-of-binary-search-tree/题目大意:给你一个整形数组AA,大小为NN。你需要判断数组AA是否可能是一个二叉搜索树的先序遍历结果。题目分析:题目只需要你判断可能性。因此,我们需要原创 2015-11-04 19:13:19 · 1061 阅读 · 0 评论 -
Segment Sieve
地址:http://www.geeksforgeeks.org/segmented-sieve/针对简单Sieve方法筛选素数时空间耗费过多的问题进行改进,从原来的O(n)降低为O(sqrt(n)).Segmented SieveGiven a number n, print all primes smaller than n. For example, if the转载 2015-11-25 15:57:33 · 721 阅读 · 0 评论 -
错排数
Count Derangements (Permutation such that no element appears in its original position)A Derangement is a permutation of n elements, such that no element appears in its original position. For example, a转载 2015-11-23 19:53:57 · 778 阅读 · 0 评论 -
XOR Groups
题目要求:给出一个整数组数AA,大小为NN。然后,将数组AA分割为两个部分A1A_1和A2A_2,且满足条件A1∩A2=∅A_1 \cap A_2 = \emptyset,A1∪A2=AA_1 \cup A_2 = A,A1,A2≠∅A_1,A_2 \neq \emptyset。计算有多少种分割方法,使得Xor(A1)=Xor(A2)Xor(A_1) = Xor(A_2)。其中,Xor(A1)=Xo原创 2015-10-16 11:11:48 · 486 阅读 · 0 评论 -
KMP字符串匹配算法的伪代码
KMP算法的图解:http://blog.youkuaiyun.com/u010232171/article/details/41945605图解中的减法操作与下面的伪代码不同,应该以下面的代码为准KMP算法的next数组求解:http://blog.youkuaiyun.com/u010232171/article/details/41961837下面的伪代码出自《算法引论——原创 2015-07-03 10:51:35 · 3304 阅读 · 0 评论 -
图的前插表示法(基于数组实现)
一般的表示方法矩阵表示法:将所有点对的关系存储到一个矩阵中,如果树有NN个点,那么需要开辟N∗NN*N大小的矩阵基于地址(或者vector容器)的链表法:将与点AA有关的边存储到AA的链表。一般选择这种方法,但是该方法需要不断的重新开辟新空间。随着图的节点增加时,需要为新节点创建空间,并添加到对应的链表中。在需要重复构建不同的图的问题中,上面两种传统的方法,或者(图的数据结构)显得效率不高。分原创 2015-11-08 14:07:16 · 497 阅读 · 0 评论 -
快速幂取模运算(Modular Exponentiation)
不考虑取模的快速幂运算(迭代法)/* Iterative Function to calculate (x^y) in O(logy) */int power(int x, unsigned int y){ int res = 1; // Initialize result while (y > 0) { // If y is odd, multip原创 2015-11-08 14:50:00 · 1231 阅读 · 0 评论 -
Find the maximum subarray XOR in a given array
geeksforgeeks的一篇文章: http://www.geeksforgeeks.org/find-the-maximum-subarray-xor-in-a-given-array/题目大意给你一个大小为NN的数组AA,元素0<=Ai<=2310<=A_i<=2^{31},即AiA_i是一个32位的非负整数。请寻找数组内异或和最大的连续子数组。注意:题目要求的是子数组,其中元素必须是连续原创 2015-11-06 17:13:22 · 1239 阅读 · 0 评论 -
POJ3764:The xor-longest Path
题目链接http://poj.org/problem?id=3764解题要点树结构内任意两点u,vu,v间的路径权值异或和f(u,v)f(u,v),具有如下性质 f(u,v)=f(root,u)xorf(root,v)f(u,v)=f(root,u)\quad xor\quad f(root,v) 其中,rootroot是根结点。找到所有节点与rootroot的路径权值异或和f(root,i原创 2015-11-07 17:11:41 · 632 阅读 · 0 评论 -
插入排序中元素的移动次数
题目大意:根据插入排序算法的原理,计算每个元素的移动次数。例如:数组A=[2,1,3,1,2]A=[2, 1, 3, 1, 2],那么按从左往右的顺序依次移动插入元素,他们的移动次数分别如下: shift(2)=0,shift(1)=1,shift(3)=0,shift(1)=2,shift(2)=1shift(2)=0, shift(1)=1, shift(3)=0, shift(1)=2, s原创 2015-09-17 21:57:43 · 5992 阅读 · 0 评论 -
最长递增子序列的nlog(n)算法
最长递增子序列问题定义解决思路测试题目问题定义输入 一个非空整数数组AA,数组大小为NN。输出 数组 AA中最长递增(严格递增)子序长度。其中,子序可以是不连续的。解决思路动态规划 动态规划的方法可以参考 《编程之美》里面第二章16题。 核心思路:每增加一个新元素时,寻找比其小的所有元素,并找出以这些元素为结束的递增子序里长度最大的加一(此结果是以新元素结尾的最长递增子序的长原创 2015-09-12 17:17:27 · 740 阅读 · 0 评论 -
POJ 3009
题目链接:http://poj.org/problem?id=3009题目大意:在一个矩形游戏盘上,有石头,冰球,终点,起点。规则:上下左右抛出冰球,且抛出后除非碰到石头或终点,否则不停止。如果出界或者连续抛出10次以上就算失败。另外,冰球不能从紧挨着石头的一方抛出;一旦冰球碰到石头,则立即停止,石头消失,然后可以进行下一次抛出。题目的思路是深度优先遍历,但是做了两晚也没做原创 2015-05-21 21:54:27 · 306 阅读 · 0 评论 -
十进制转二进制
声明:最后一种降幂法颇具魅力,而且与方法二有异曲同工之妙十进制转二进制的几种方法输入:一个无符号的十进制整数输出:对应十进制的二进制显示 例如:input=10,output=1010 方法一:除二取余法 Forinput!=0 Cout Input/=2;End 输出顺序从低位0到高位(最高的1)依次输出 方法二:位运算原创 2015-04-28 20:40:48 · 1192 阅读 · 0 评论 -
逆波兰表达式
逆波兰表达式是一种表示运算式的方法,又可以称作后缀表达式,与之相对的是中缀表达式。例如:中缀表达式:a+b*c,后缀表达式:abc*+。这里的例子简单,但是基本表达了两种方法的不同。 下面给出包含“+-*/”以及“()”五种运算符的中缀表达式转后缀表达式的算法流程:1. 优先级的规定:"()">"*/">"+-",其中"*"=="/","+"=="-"。2. 输入一组表达式F原创 2015-04-28 14:58:30 · 540 阅读 · 0 评论 -
POJ 3069
本题利用贪心法计算最少的点数,问题本不难,但如何简洁高效的实现算法,却很讲究技巧:题目的连接:点击打开链接//#include#include#includeusing namespace std;const int N=1002;int X[N];int main(){ int R,n; while(cin>>R>>n&&R!=-1&&n!=-1){原创 2014-12-07 22:01:28 · 335 阅读 · 0 评论 -
POJ 3617 Best Cow line
题目大意:从一个已知的字符串A中的首尾位置之中任意挑选一个字符,连续添加到另一个空字符B的尾部,要求最后新组合成的字符串原字符大小相同,但是字典排序最小。字典排序的意思就是按照英文字典的单词排列规则。这里分析可知每次只能从A的首尾挑选字符作为B的高位字符,根据字典排序的规则可以知道,尽量选择小的字符排在高位,那么它的字典序就越小。因此,基本策略是比较首尾字符,取较小者优先输出,挑选原创 2014-12-06 20:47:44 · 386 阅读 · 0 评论 -
POJ 2386 Lake counting
本题链接可在poj 中根据题号找到基本思路:通过深度优先遍历的方法找出所有八连通的点,即如果有一点是水,那么周围是水的点应该按深度优先遍历,并置为‘.’。按照上述的过程一直遍历,那么相连通的水集合都会被置为‘.’,但是其他不连通的点依然保持不变,因此我们需要对原始图进行一次遍历,如果有水,则按照上述的过程dfs。总之,在图上遇到几次水,说明有几个水集合。代码如下:#include#i原创 2014-12-06 16:10:14 · 294 阅读 · 0 评论 -
POJ:1852 ANTs
这是POJ上的一道算法题目,不算太难,主要是需要换一个角度分析问题,即挖掘问题的本质,从另一个角度简化问题。原理如下:初看题目似乎有些困难,但是可以讲两个相遇的蚂蚁之后的行为理解为没有折返,因此针对最长时间的策略应该是选择每个蚂蚁朝最远端行走,然后取其中值最大的时间作为输出;最短时间相对简单些,每只蚂蚁朝最近端走,也不会出现两两相遇的情况,然后找其中时间最大者作为输出。本题的主要收获:原创 2014-12-06 14:27:07 · 414 阅读 · 0 评论 -
SPFA算法文字简介
本文转载自http://www.cnblogs.com/devtang/archive/2011/08/25/spfa.html原文中有作者自己实现的SPFA代码,但本文并未贴出,究其原因还是应该自己写一写,才能明白道理。下述的SPFA算法可以处理带有负权值边的图,但无法处理带有负环的图。SPFA(Shortest Path Faster Algorithm)是Be转载 2014-12-21 17:41:08 · 484 阅读 · 0 评论 -
神器 VisuAlgo:通过动画学习算法和数据结构
本文属于转载文章,文中提到的网站确实有动画效果,想必对算法的理解会更加深刻和快速,当然,自己手推一遍应该还是最好的。网址:http://www.youkuaiyun.com/article/2014-12-02/2822915-VisuAlgo?reload=1VisuAlgo是由Steven Halim博士在2011年发布的一款可视化学习算法的工具,用于帮助其学生更好地理解数据结构和算法,可转载 2014-12-04 22:23:15 · 930 阅读 · 0 评论 -
KMP算法中的Next数组的求取
本文针对博客中下部链接:点击打开链接的内容,进行补充。主要是如何计算Next数组,通过计算得到的next数组,可以轻松计算,每次移动的位数,代码如下:void getNext(const char * ss, int len){ //int next[9]; int j = -1, i = 0; Next[0] = -1; while(i < len) {原创 2014-12-16 16:21:49 · 816 阅读 · 0 评论 -
POJ:题号 2269---------Friends问题
#include#include#include#include#include#include//#includeusing namespace std;int main(){ //DWORD t1 = GetTickCount(); map mapoper; mapoper['(']=2; mapoper[')']=2; mapoper['*']=1; ma原创 2014-10-27 17:44:48 · 542 阅读 · 0 评论 -
最大子序乘积问题的分析
最大子序乘积的问题分析首先,题目概述: 这里的问题针对的是整形数组,即像A[10]={1,3-2,5,66,-45,63,0,2,1}这样的数组。 因此,可以知道数组的数可以分为三种类型:1.正数2.零3.负数除此之外,还有乘法的特性:正正得正,正负得负,负负得正,以及乘零等于零。明白了上述基本数学内容后,现在给出两种分析思路,都可以原创 2014-11-26 15:30:27 · 477 阅读 · 0 评论 -
POJ:题号 3295------tautology
#include#include#include#includeusing namespace std;int iOpe[]={0,0,0,0,0};char cOpe[]={'p','q','r','s','t'};set scOpe(cOpe,cOpe+5);map mpOpe;//核心思路:采用递归的方法//表达式中没有小括号,且各个运算符的优先级相同//唯一的区别就是双目和单目运算//一个原创 2014-10-31 19:52:41 · 657 阅读 · 0 评论 -
Trie树计算单词前缀的个数
时间限制:10000ms单点时限:1000ms内存限制:256MB描述小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进。这一天,他们遇到了一本词典,于是小Hi就向小Ho提出了那个经典的问题:“小Ho,你能不能对于每一个我给出的字符串,都在这个词典里面找到以这个字符串开头的所有单词呢?原创 2015-02-01 19:31:58 · 762 阅读 · 0 评论 -
最近公共祖先
#1062 : 最近公共祖先·一时间限制:10000ms单点时限:1000ms内存限制:256MB描述小Ho最近发现了一个神奇的网站!虽然还不够像58同城那样神奇,但这个网站仍然让小Ho乐在其中,但这是为什么呢?“为什么呢?”小Hi如是问道,在他的观察中小Ho已经沉迷这个网站一周之久了,甚至连他心爱的树玩具都弃置一边。“嘿嘿,小H原创 2015-02-01 21:49:15 · 331 阅读 · 0 评论 -
POJ 1423 BIG NUMBER
题目连接:http://poj.org/problem?id=1423题目大意是给一个输入m,计算F(m!)(m的阶乘)的位数,即F(3!)==1,F(4!)==2对于此类题目的第一反应:这个是一个数学问题。 既然是数学问题,那么在思考或者搜索资料时的关键字不是题目的标题,而是阶乘的计算公式。当然,网上会给出最一般的连乘表达式,这不是我们需要的,应该原创 2015-04-27 18:04:10 · 512 阅读 · 0 评论 -
编程珠玑之第二章:杂耍算法
本文系转载链接 http://www.cnblogs.com/solidblog/archive/2012/07/15/2592009.html作者在文中的证明思路清晰,不过我只看懂了辗转相除法的证明,杂耍的证明未看懂,但是仔细模拟杂耍算法的过程会有比较直接的体会。问题:将大小为n的数组向左移动i位基本原理: 1)先将x[0]移到临时变量t中 2)将x[i转载 2015-04-09 20:42:44 · 751 阅读 · 0 评论