摘要:问题描述: 给定一个足够大的随机选择函数rand(), 对于[0, n)范围内的数,随机选取m个(m<n),且取出的m个数有序排列(增序或减序)。问题解答:1、 一开始拿到问题的时候,我的想法就是从rand()%n中取出m个不同的数。这其中需要解决的问题一个就是如何去重,另一个是排序问题。 作者的算法参考自《The Art of Computer Programming. Volume2: Seminumerical Algorithms》,考虑方向完全不一样。 该算法依次考虑整数0,1,2……n-1,并通过一个适当的随机测试对每个整数进行选择。通过按序访问整数,可以保证输出结果的有序.
阅读全文
摘要:问题描述:问题的输入是具有n个整数的向量x,输出是输入向量的任何子向量中的最大和。例如下面的向量:31-415926-535897-93-2384那么改程序的输出就应该是59 到 97之间的总和,即187.但所有数为正数的时候,答案就是整个输入向量,可是我们必须要考虑负数的情况。问题解答:1、第一种方法式最简单的,对所有满足0 <= i <= j < n的(i,j)整数对进行迭代。找出总和最大的那个。这种方式的时间复杂度为O(n^3)。具体做法不在赘述。2、第二种方式是将时间复杂度降低到O(n^2),需要注意到x[i..j]的总和和前面已经计算出得总和x[i..j-1]有密切
阅读全文
摘要:问题描述:求一段字符串中最大的回文子串,比如字符串c1 =123456789aaabbbccccccbbbddd987654321,最大的回文子串就是bbbccccccbbb问题解答:之前使用后缀树来找过最长公共子串问题(可参考我之前的bloghttp://www.cnblogs.com/L-aho/articles/2444768.html),在这里同样可以利用上。需要做的就是再反向复制原有子串c2 =123456789dddbbbccccccbbbaaa987654321,针对这个字符串同样建立一棵后缀树。使用qsort来对两棵后缀树进行排序操作,我们就能分别得到下面的结构:1、对于两边的
阅读全文
摘要:问题描述:12个工厂分布在一条东西向高速公路的两侧,工厂距离公路最西端的距离分别是0、4、5、10、12、18、27、30、31、38、39、47.在这12个工厂中选取3个原料供应厂,使得剩余工厂到最近的原料供应厂距离之和最短,问应该选哪三个厂?问题解答:拿到题目后本想使用动态规划来做,怎奈感觉运用不上,只好采取枚举的笨方法。若有好的方法还望指教,下面枚举的程序: #include <iostream> #include <math.h> #include <stdlib.h> using namespace std; #define N 12 #defin
阅读全文
摘要:问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数。求最终胜利者的编号。问题解答:我们知道第一个人(编号一定是(m-1)%n) 出列之后,剩下的n-1个人组成了一个新的约瑟夫环(以编号为k=m%n的人开始): k k+1 k+2 ... n-2, n-1, 0, 1, 2,... k-2 并且从k开始报0。 现在我们把他们的编号做一下转换: k --> 0 k+1 --> 1 k+2 --> 2 ... ... k-3 --> n-3 k-2 --> n-2 变换后就完完全全成为了(n-1)个人报数的子问题,假如我
阅读全文
摘要:问题描述:如draw something游戏中,玩家会针对给定的单词绘画;另一边的玩家则会根据给定的N个字母来猜测出字母数为M的单词。例如,给定12个字母a b b c d d g ……,让你猜测字母数为7的单词。要求:在没有其他前提的情况下,根据字典中的单词给出所有可能的单词集合。(字典的数据结构可自行定义)解答:1)拿到问题,我的第一想法就是针对字典来建立课trie tree(字典树),然后对与给定的N个单词,通过此trie tree来寻找所有可能的情况。比如上面的例子,我就需要先寻找a开头的单词,再继续寻找后面可能跟着b c d之类的单词。2)方案2,针对字典,我先将拥有相同字母的单词分
阅读全文