上一页 1 ··· 10 11 12 13 14 15 16 17 18 ··· 24 下一页
摘要: 设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度为O(N),且只允许使用两个附加变量。不合题意的解法如下:我们先试验简单的办法,可以每次将数组中的元素右移一位,循环K次。abcd1234→4abcd123→34abcd12→234abcd1→1234abcd。伪代码如下:代码清单2-33RightShift(int* arr, int N, int K){while(K--){int t = arr[N - 1];for(int i = N - 1; i > 0; i --)arr[i] = arr[i - 1];arr[0] = t;}}虽然这个算法可以实现数组的循环 阅读全文
posted @ 2013-06-25 16:50 夜雨阑珊 阅读(10482) 评论(1) 推荐(2) 编辑
摘要: 题目概述:有一个没有排序,元素个数为2N的正整数数组。要求把它分割为元素个数为N的两个数组,并使两个子数组的和最接近。假设数组A[1..2N]所有元素的和是SUM。模仿动态规划解0-1背包问题的策略,令S(k, i)表示前k个元素中任意i个元素的和的集合。显然:S(k, 1) = {A[i] | 1N?N:k;i>=1;i--){//这点有点难以理解啊//两层外循环是遍历集合S(k,i)for(j=0;j=A[k]&&flag[i-1][j-A[k]])flag[i][j]=true;}}}for(i=sum/2;i>=0;i--){if(flag[N][i]){c 阅读全文
posted @ 2013-06-25 16:49 夜雨阑珊 阅读(4034) 评论(0) 推荐(0) 编辑
摘要: 求子数组之和的最大值是一个很经典的问题。问题的描述如下:一个有N个整形数的一维数组(A[0], A[1], ... A[n-1]),这个数组有很多子数组,那么子数组之和的最大值是什么呢? 这个问题的解答其实在《编程珠玑》一书有的。一共是4中方法:第一种是穷举法,计算所有可能子数组的和,时间复杂度为O(n3)。第二种其实也是穷举法。代码如下:[cpp]view plaincopyfor(i=0;imaxsum)maxsum=sum;}10. } 很明显复杂度为O(n2)。第三种方法是分治法,将数组元素均分成两部分,那么最大子数组和只有三种情况。在左边部分,右边部分,以及跨越了边界部... 阅读全文
posted @ 2013-06-25 16:48 夜雨阑珊 阅读(1000) 评论(0) 推荐(0) 编辑
摘要: 题目:给定一些无序区间,判断某个给定的特定区间是否在这些无序的区间内。这个题目比较简单,首先将给定的区间排序,在对重合的区间进行排序,使得区间变成递增且不重叠的若干个区间,对于给定的区间在已经处理好的区间内进行二分查找,完成区间覆盖的判断。程序如下:[cpp]view plaincopy#include#include#includeclassInterval{public:Interval(intstart,intend):start_(start),end_(end){}Interval():start_(0),end_(0){}staticboolOrderByStart(constIn 阅读全文
posted @ 2013-06-25 16:47 夜雨阑珊 阅读(1117) 评论(0) 推荐(0) 编辑
摘要: 问题描述:一个比较经典的问题,判断两个链表是否相交,如果相交找出他们的交点。思路:1、碰到这个问题,第一印象是采用hash来判断,将两个链表的节点进行hash,然后判断出节点,这种想法当然是可以的。2、当然采用暴力的方法也是可以的,遍历两个链表,在遍历的过程中进行比较,看节点是否相同。3、第三种思路是比较奇特的,在编程之美上看到的。先遍历第一个链表到他的尾部,然后将尾部的next指针指向第二个链表(尾部指针的next本来指向的是null)。这样两个链表就合成了一个链表,判断原来的两个链表是否相交也就转变成了判断新的链表是否有环的问题了:即判断单链表是否有环?这样进行转换后就可以从链表头部进行判 阅读全文
posted @ 2013-06-25 16:46 夜雨阑珊 阅读(542) 评论(0) 推荐(0) 编辑
摘要: 题目:有一根27厘米长的细木杆,在第3厘米,7厘米,11厘米,17厘米,23厘米这五个位置上各有一只蚂蚁,木杆很细,不能同时通过两只蚂蚁,开始时,蚂蚁的头朝向左还是右是任意的,它们只会朝前走或掉头,但不会后退,当任意两只蚂蚁相遇后,蚂蚁会同时掉头朝反方向走,假设蚂蚁们每秒钟可以走1厘米的距离。编写程序(C/C++),求所有蚂蚁都离开木杆的最小时间和最大时间。(百度面试题)读完这道题以后,我的想法是:最短时间考虑如下:首先标出木杆的中点,即在(0+27)/2=13.5厘米处。然后所有的蚂蚁都沿着木杆向离自己较近的一端走,这样所有蚂蚁都离开木杆的时间是最短的,即,为距离木杆中点最近的蚂蚁走向离它最 阅读全文
posted @ 2013-06-25 16:44 夜雨阑珊 阅读(1231) 评论(0) 推荐(0) 编辑
摘要: 2012-04-18 16:412.12快速寻找满足条件的两个数---程序员编程艺术之五第一节、寻找满足条件的两个数第14题(数组):题目:输入一个数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。分析:咱们试着一步一步解决这个问题(注意阐述中数列有序无序的区别):直接穷举,从数组中任意选取两个数,判定它们的和是否为输入的那个数字。此举复杂度为O(N^2)。很显然,我们要寻找效率更高的解法。 题目相当于,对每个 阅读全文
posted @ 2013-06-25 16:43 夜雨阑珊 阅读(658) 评论(0) 推荐(0) 编辑
摘要: 本人阅读了《编程之美》,参阅了其中的——计算字符串的相似度——一节。感觉颇为实用。现将这一文章贴于此处,并将代码赋予其后。 许多程序会大量使用字符串。对于不同的字符串,我们希望能够有办法判断其相似程度。我们定义了一套操作方法来把两个不相同的字符串变得相同,具体的操作方法为: 1.修改一个字符(如把“a”替换为“b”)。 2.增加一个字符(如把“abdd”变为“aebdd”)。 3.删除一个字符(如把“travelling”变为“traveling”)。 比如,对于“abcdefg”和“abcdef”两个字符串来说,我们认为可以通过增加/减少一个“g“的方式来达到目的。上面... 阅读全文
posted @ 2013-06-25 16:42 夜雨阑珊 阅读(1072) 评论(0) 推荐(0) 编辑
摘要: 分层遍历二叉树《编程之美》3.10问题:给定一颗二叉树,要求按分层遍历该二叉树,即从上到下按层次访问该二叉树(每一层单独输出一行),每一层要求访问的顺序为从左到右,并将节点依次编号。解:算法1printNodeAtLevel(Node *root, int level)if(level == 0 && root) 输出root->data returnif(root==NULL) returnprintNodeAtLevel(root->left, level-1)printNodeAtLevel(root->right, level-1)如果写成:print 阅读全文
posted @ 2013-06-25 16:41 夜雨阑珊 阅读(1366) 评论(0) 推荐(0) 编辑
摘要: 昨天花了一个晚上为《编程之美》,在豆瓣写了一篇书评《迟来的书评和感想──给喜爱编程的朋友》。书评就不转载到这里了,取而代之,在这里介绍书里其中一条问题的另一个解法。这个解法比较简短易读及降低了空间复杂度,或者可以说觉得比较「美」吧。问题定义如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数。写一个程序求一棵二叉树中相距最远的两个节点之间的距离。书上的解法书中对这个问题的分析是很清楚的,我尝试用自己的方式简短覆述。计算一个二叉树的最大距离有两个情况:情况A: 路径经过左子树的最深节点,通过根节点,再到右子树的最深节点。情况B: 阅读全文
posted @ 2013-06-25 16:38 夜雨阑珊 阅读(1912) 评论(0) 推荐(0) 编辑
上一页 1 ··· 10 11 12 13 14 15 16 17 18 ··· 24 下一页