摘要:
思路:最大公约数问题也是一个非常典型的递归算法的应用。每次递归使得原来求两个大数之间的公约数转变成求两个稍微小点的数之间的公约数,要求转换的过程要保证不会改变公约数的值。这就要看其中转换的原理了。原理从《几何原本》中得出--辗转相除。假设f(x, y) 表示x,y的最大公约数是g,而k = x/y,b= x%y,则g必能整出b。因为x = ky + b,b = x - ky,b/g = (x-ky)/g一定为整数,所以必有g整除b。如下所示:f(42, 30) = f(30, 12) = f(12, 6)= f(6, 0) = 6代码如下:[html]view plaincopyintgcd( 阅读全文
摘要:
题目:给定两个字符串S1,S2,要求判断是否通过S1循环移位可以得到S2,比如说:S1 = AABCD,S2 = CDAA,结果返回true。给定S1=ABCD和S2=ACBD,结果返回false。方法1:最简单的就是将S1循环一遍,每一次都是将S1循环右移一位,然后和S2进行比较。效率低到O(len(S1)*len(S2)).代码:#include "stdafx.h"#include#include#include#include#include#include#include#includeusing namespace std;//O(len(s1)*len(s2) 阅读全文
摘要:
题目:给定一个长度为N的整数数组,只允许使用乘法,不能用除法,计算任意N-1个数的组合中乘积中最大的一组,并写出算法的时间复杂度。解法: 实际上第一反应就是先将N个数相乘得到结果,然后遍历每一个数,看去掉哪个数最适合,注意正负号。效率O(N). 但是文章在最后指出不允许用除法的用意是这样的,乘法很容易溢出。意思是干脆乘法也不要用。文中给出如下几种算法:源码出自:http://blog.csdn.net/qq120848369/archive/2010/05/12/5583796.aspx算法一: 枚举每一个不在N-1内的数,分别计算剩余N-1个数的乘积, 由于有N种情况,每种情况遍历计算乘积, 阅读全文
摘要:
http://www.cnblogs.com/flyoung2008/archive/2011/08/16/2141579.html中序和后序也能重构------------前序和后序好像不能重构----没找到资料已只二叉树的前序和中序遍历,要求构建出完整的二叉树 如前序遍历为:a b d c e f 中序遍历为:d b a e c f 由于前序遍历先访问的是根节点所以整棵树的根节点是a 中序遍历中,先访问左子树,再访问右子树,所以d b 是左子树,e c f 是右子树 如此递归下去,可以找到整棵树的结构#include #define TREELEN ... 阅读全文
摘要:
问题描述:写一个程序,对于一个64位正整数,输出它所有可能的连续自然数(两个以上)之和的算式。例如:3=1+2; 9=5+4; 9=2+3+4。刚开始看到这个题目,直接想到的方法就是蛮力解决:即对于每一个输入的整数,从1开始加,一直加到等于或者大于这个整数为止。如果等于这个整数,则找到了一种连续自然数相加的模式;如果大于这个整数,则无法找到,继续从2开始加,依次类推。例如对于5来说,首先从1开始加:1+2+3=6>5,这样从1开始就无法找到,从而停止继续相加;然后从2开始相加:2+3=5,成功找到。这是很自然的一种想法,可以达到题目要求。但是,很显然工作量比较大,程序时间复杂度高。于是百 阅读全文
摘要:
Tango是微软亚洲研究院的一个试验项目。研究院的员工和实习生们都很喜欢在Tango上面交流灌水。传说,Tango有一大“水王”,他不但喜欢发贴,还会回复其他ID发的每个帖子。坊间风闻该“水王”发帖数目超过了帖子总数的一半。如果你有一个当前论坛上所有帖子(包括回帖)的列表,其中帖子作者的ID也在表中,你能快速找出这个传说中的Tango水王吗?分析与解法首先想到的是一个最直接的方法,我们可以对所有ID进行排序。然后再扫描一遍排好序的ID列表,统计各个ID出现的次数。如果某个ID出现的次数超过总数的一半,那么就输出这个ID。这个算法的时间复杂度为O(N * log2N + N)。如果ID列表已经是 阅读全文
摘要:
原创文章,转载请注明出处~~ http://www.cnblogs.com/justinzhang/问题描述:给定平面上N个点的坐标,找出距离最近的两个点。 这是编程之美2.11的一道题目,从昨天到现在就一直在设法解决它;如果用常规的解法,只需要将N个点两两计算距离,然后找出最小距离的两个点就可以了;但是这种解法的算法复杂度为O(N^2); 为了降低算法的复杂度,我们需要有更好的方法。这里我们找到的解法是分治法。设点集为S,|S|=N,S的横坐标集合为Sx,纵坐标集合为Sy;算法的步骤如下:1.找出Sx的中位数:median_Sx;用median_Sx对点集S进行划分,左边的为S1,右边的为S 阅读全文
摘要:
这是编程之美书第2.5节的一道题目。各种解法:解法一,用nlgn复杂度的排序算法对数组进行从大到小排序,取前K个。但这方法做了两件不必要做的事:它对想得到的K个数进行了排序,对不想得到的n-K个数也进行了排序。方法不可取。解法二,用选择排序或冒泡排序,复杂度O(NK)。但这方法也做了不必要做的一件事:对想得到的K个数进行了排序。方法不可取。解法三,用顺序统计位(类快排)算法来计算(可参考算法导论)。算法导论上说这种方法从平均性能上来讲是线性的,但编程之美上却说复杂度是O(N*lgK)。对于这点,我对编程之美持怀疑态度。我认为,对于一个无序的数组,用顺序统计位算法,可以在近似O(n)的时间复杂度 阅读全文
摘要:
最简单的方法就是N中的每个数分别和max,min比较,看似2N次比较,其实大于max的就不必和min比较,小于min的也不必和max比较,因此比较的次数不足2N次,程序如下:[cpp]view plaincopyboolMaxMin(std::vectorarray,T*max,T*min){if(array.size()*max){10. *max=array[i];11. }elseif(array[i]boolMaxMin_1(std::vectorarray,T*max,T*min){if(array.size()=array[index+1]){12. if(array[index] 阅读全文
摘要:
求数组中最长递增子序列写一个时间复杂度尽可能低的程序,求一个一维数组(N个元素)中的最长递增子序列的长度。例如:在序列1,-1,2,-3,4,-5,6,-7中,其最长的递增子序列为1,2,4,6。分析与解法根据题目的要求,求一维数组中的最长递增子序列,也就是找一个标号的序列b[0],b[1],…,b[m](0 1,2>-1。因此,最长的递增序列为(1,2),(-1,2),长度为2。在这里,2前面是1还是-1对求出后面的递增序列没有直接影响。(但是在其它情况下可能有影响)依此类推之后,我们得出如下的结论。假设在目标数组array[]的前i个元素中,最长递增子序列的长度为LIS[i]。那么, 阅读全文