随笔分类 - alg_per_day
hunt for job
摘要:有n个士兵,每个士兵知道不同的军事秘密,每两个士兵可以通过一次交流来互相知晓对方掌握的信息,现设计最优的策略来使得通过最少的交流次数使所有士兵知道所有军事秘密,并给出最优策略所需的交流次数。(给出算法思路,计算次数)网络思路:使用归并法,设前n/2个士兵组成的集合A互相知晓集合内所有士兵的秘密,不知道其他任意士兵的秘密,后n/2个士兵组成的集合B也只知道自己集合内部的所有秘密。从集合A中取一个士兵a,从集合B中取一个士兵b,让a、b互相交流之后,则a、b知道了所有的军事秘密,经过n/2次上述操作后,算法完成。对于集合A内部的士兵,用同样的方法分为两个小集合进行同样的操作。基本操作和归并排序类似
阅读全文
摘要:阿里的题目:有n-1个群众和1个明星,群众两两间可能认识也可能不认识,但是群众都认识明星,明星不认识其他任何人。现在每次询问一个人是否认识另一个人的时间复杂度是O(1),要求找出明星的时间复杂度。笔试时,完全不知道在写什么。题目似乎都没有分析清楚。胡搞了一番,老是对着“群众都认识明星”这个point思考。结论就是O(n^2),晕。其实,切入点应该为“只有一个明星,群众都认识明星,明星不认识群众”(说等没说),引用网络得出的一个重要的结论:首先分析一次询问的效果。is A 认识 B? (yes) A不是明星,B可能是明星 : (no) A可能是明星,B是群众。所以一次询问可以确定一个人。所以一次
阅读全文
摘要:一个int数组,里面数据无任何限制,要求求出所有这样的数a[i],其左边的数都小于等于它,右边的数都大于等于它。能否只用一个额外数组和少量其它空间实现。老早就想把这道题目写了,一直没写;N天不碰算法,思维完全钝了。网络上的解法思路(见附),都是一直的。那如果再说一模一样的就没太大意思,除了记录题目和增加网络冗余度之外;其实这里说的和网络大部分也是一样的,但是,解释稍微转变,希望让你这透彻的看懂它。经一番琢磨,题目很网上的解释包含了一个很简单的思想,“单调栈”,哈哈,是不是很熟悉呢?如果想不起来,就回去看看其他博文中的题目吧:单调栈:柱形统计图中最大面积(POJ 2559)谁看得最大(使用了单调
阅读全文
摘要:给定含有n个元素的整型数组a,其中包括0元素和非0元素,对数组进行排序,要求:1、排序后所有0元素在前,所有非零元素在后,且非零元素排序前后相对位置不变2、不能使用额外存储空间例子如下输入 0、3、0、2、1、0、0输出 0、0、0、0、3、2、1关注题目要求:非零元素排序前后相对位置不变, 只要求的是非零元素而已是不是想起了之前的一道题目,不改变正负数之间相对顺序重新排列数组.时间O(N),空间O(1)直接copy网上代码: 1 void Arrange(int *arr , int n) 2 { 3 int i , k = n-1; 4 for(i = n-1 ; i >=...
阅读全文
摘要:在经过了一系列问题的铺垫之后,终于来到boss这关了。。均分纸牌石子合并问题矩阵连乘糖果传递问题(和仓库运输问题一样的,这里给出糖果传递的题目):老师准备了一堆糖果,恰好n个小朋友可以分到数目一样多的糖果.老师要n个小朋友去拿糖果,然后围着圆桌坐好,第1个小朋友的左边是第n个小朋友其他第i个小朋友左边是第i-1个小朋友。大家坐好后,老师发现,有些小朋友抢了很多的糖果,有的小朋友只得到了一点点糖果,甚至一颗也没有,设第ai个小朋友有ai颗糖果.小朋友们可以选择将一些糖果给他左边的或者右边的小朋友,通过”糖果传递”最后使得每个小朋友得到的糖果数是一样多的,假设一颗糖果从一个小朋友传给另一个小朋友的
阅读全文
摘要:均分纸牌[问题描述] 有 N 堆纸牌,编号分别为 1,2,…, N。每堆上有若干张,但纸牌总数必为 N 的倍数。可以在任一堆上取若于张纸牌,然后移动。 移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 的堆上;在编号为 N 的堆上取的纸牌,只能移到编号为 N-1 的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。 现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。 例如 N=4,4 堆纸牌数分别为: ① 9 ② 8 ③ 17 ④ 6 移动3次可达到目的: 从 ③ 取 4 张牌放到 ④ (9 8 13 10) -> 从 ③ 取 3 张牌放到 ②(9 ...
阅读全文
摘要:石子合并问题想了N久,想原创性的从另一个角度分析问题。。。然后没想出来。。。再然后就无耻的把别人的copy了一份(原文):时限:1000ms 内存限制:10000K 总时限:3000ms描述:在一个圆形操场的四周摆放着n堆石子(n<= 100),现要将石子有次序地合并成一堆。规定每次只能选取相邻的两堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分。编一程序,读入石子堆数n及每堆的石子数(<=20)。选择一种合并石子的方案,使得做n-1次合并,得分的总和最小;比如有4堆石子:4 4 5 9 则最佳合并方案如下:4 4 5 9 score: 08 5 9 score: 813
阅读全文
摘要:矩阵连乘问题:先考察3个矩阵{A1,A2,A3}连乘,设这三个矩阵的维数分别为10×100,100×5,5×50。若按((A1A2)A3)方式需要的数乘次数为10×100×5+10×5×50=7500,若按(A1(A2A3))方式需要的数乘次数为100×5×50+10×100×50=75000。矩阵连乘问题是《算法导论》的一道经典题目;思想:将一系列相乘的矩阵(Ai....Aj)划分为两部分;即(AiAi+1...Ak)(Ak+1Ak+2....Aj),k的位置要保证左边括号和右边括号
阅读全文
摘要:Ackerman问题:ackerman(m,n)= (n+1) [m=0] ackerman(m-1,1) [m<>0, n=0] ackerman ( m-1 , ackerman(m , n)) [m<>0, n<>0] 1 int ackerman(int m, int n) //递归算法 2 { 3 if (m==0) 4 { 5 return n+1; 6 } 7 else if (n ==0 ) 8 { 9 return ackerman(m-1, 1);10 }11 else12 {1...
阅读全文
摘要:题目描述:给定一个源串和目标串,能够对源串进行如下操作: 1.在给定位置上插入一个字符 2.替换任意字符 3.删除任意字符写一个程序,返回最小操作数,使得对源串进行这些操作后等于目标串,源串和目标串的长度都小于2000。此题反复出现,最近考的最多的是百度和Google的笔试面试经常考察。D(n,m)即为字符串X[0...n-1]与Y[0...m-1]之间的最小编辑距离 1 #include <iostream> 2 #include <assert.h> 3 #include <stdlib.h> 4 5 int func31(char a[], int n
阅读全文
摘要:原题是这样的:一个未排序整数数组,有正负数,重新排列使负数排在正数前面,并且要求不改变原来的正负数之间相对顺序。比如: input: 1,7,-5,9,-12,15 ,ans: -5,-12,1,7,9,15 。且要求时间复杂度O(N),空间O(1) 。一道曾经做过n次的题目,当时做时没有“要求不改变原来的正负数之间相对顺序”条件,几天都没有做些虐心的算法题了,被虐贯了%>_<%一看题目先把去掉那个附加条件的经典题目扫一遍。思想简单利用快排的分类:简单到都不愿写code: 1 void func30(int a[], int n) 2 { 3 int i, j, tmp; 4 5
阅读全文
摘要:题目大意:给出一个柱形统计图(histogram), 它的每个项目的宽度是1, 高度和具体问题有关。 现在编程求出在这个柱形图中的最大面积的长方形。例如:7 2 1 4 5 1 3 37表示柱形图有7个数据,分别是 2 1 4 5 1 3 3, 对应的柱形图如下,最后求出来的面积最大的图如右图所示。一开始又是各种挫计O(n^2),隐约感觉可以利用以前的某道题目的思想,然后,然后还是记不起来。。。各种整之后,还是省点时间吧~ ⊙﹏⊙b ;关键字:“单调栈”感觉凉风一阵,什么情况,从没有见过的数据结构。赶紧上google百度之:定义:单调栈,顾名思义就是说栈内的元素,按照某种方式排序下,必须是单调
阅读全文
摘要:《编程之美》4.7节描述了蚂蚁爬杆问题,把所有具体数字都表示成字母后变为形如如下形式的问题:有一根长为L的平行于x轴的细木杆,其左端点的x坐标为0(故右端点的x坐标为L)。刚开始时,上面有N只蚂蚁,第i(1≤i≤N)只蚂蚁的横坐标为xi(假设xi已经按照递增顺序排列),方向为di(0表示向左,1表示向右),每个蚂蚁都以速度v向前走,当任意两只蚂蚁碰头时,它们会同时调头朝相反方向走,速度不变。编写程序求所有蚂蚁都离开木杆需要多长时间。该问题是经典问题了,有O(N)的解法。扩展问题现列出如下:第i只蚂蚁什么时候走出木杆?所有蚂蚁从一开始到全部离开木杆共碰撞了多少次?第k次碰撞发生在哪个时刻?哪个位
阅读全文
摘要:编程之美的中的课后习题:问题:已知集合S有n个元素x1,x2,….xn,求其中最大的和第二大的元素。1、朴实的遍历寻找。寻找最大数的比较次数为n-1,第二大为n-2次,总次数2n-3;2、分治法。分析:我们要尽可能的减少比较次数,为简单起见,设n为2的幂。分治:把S分成大小为n/2的两个子集P和Q。如果现在直接进行归纳,则假设已知P和Q中的最大和第二大的元素,分别记为p1,p2和q1,q2,然后查找S中的最大和第二大的元素。很明显,两次比较足以找到S中的这两个元素。第一次比较最大数p1和q1,此时得到一个新的第二大的数,这个数与原来的第二大的数(P或Q中的一个)比较一次,记为所求(比较过程见下
阅读全文
摘要:时间限制:2 秒内存限制:32 兆特殊判题:否题目描述:小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!输入:输入有多组数据。每组数据仅包括1个整数S(S<=1,000,000)。如果S为负数时,则结束输入。输出:对应每组数据,若不存在和为S的连续正数序列,则输出“Pity!”;否则,按照开始数字
阅读全文
摘要:时间限制:1 秒内存限制:32 兆特殊判题:否题目描述:统计一个数字在排序数组中出现的次数。输入:每个测试案例包括两行:第一行有1个整数n,表示数组的大小。1<=n <= 10^6。第二行有n个整数,表示数组元素,每个元素均为int。第三行有1个整数m,表示接下来有m次查询。1<=m<=10^3。下面有m行,每行有一个整数k,表示要查询的数。输出:对应每个测试案例,有m行输出,每行1整数,表示数组中该数字出现的次数。样例输入:81 2 3 3 3 3 4 513样例输出:4方案:1、对于每一个需要查找的数在排好序数组中二分查找,如果存在,定位好之后向前向后查找出现个数,
阅读全文
摘要:题目:在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。例如,有一个数组为Array[0..n] 其中有元素a[i],a[j].如果 当i<j时,a[i]>a[j],那么我们就称(a[i],a[j])为一个逆序对。在数组{7,5,6,4}中一共存在5对逆序对,分别是(7,6),(7,5),(7,4),(6,4),(5,4)。花了很长时间想还是没有想出来怎么做,怎么也不服气。。。最后还是折服了,上网查。。。才看到文章的 “排序算法汇总->归并排序”这句话的时候,兴奋不已(你妹啊!分治法~)。。放弃继续看下去
阅读全文
摘要:淘宝笔试题:对于一颗完全二叉树,要求给所有节点加上一个pNext指针,指向同一层的相邻节点;如果当前节点已经是该层的最后一个节点,则将pNext指针指向NULL;给出程序实现,并分析时间复杂度和空间复杂度。题目的只是层遍历的变形。。朋友过来一起玩了几天,不亦乐乎。。。结果写些code都是一堆一堆bug。。。 1 struct SBinaryTreeNode // a node of the binary tree 2 { 3 int m_nValue; // value of node 4 SBinaryTreeNode *m_pLeft; //...
阅读全文
摘要:某同学的同学摩根电面的一道题目:有一个大的textfile,里面很多英文单词,查找重复出现的单词;题目的简单:全部遍历太慢,考官说太慢,为什么不使用stl的map实现呢?如果不是单词呢?如果是url呢?为什么不使用hash_map呢?Good!如果还是单词,能不能再快点呢?能,使用强大的Trie吧!使用stl的map实现:#pragma warning(disable : 4786)#include <iostream>#include <string>#include <map>using namespace std;int main(){ map<
阅读全文
摘要:百度2012实习生校园招聘笔试题数组al[0,mid-1]和al[mid,num-1]是各自有序的,对数组al[0,num-1]的两个子有序段进行merge,得到al[0,num-1]整体有序。要求空间复杂度为O(1)。注:al[i]元素是支持'<'运算符的。先是琢磨良久,是否可能时间复杂度为O(n),因为这让我想起了,左旋转数组的相关的算法。深陷下去后,突然什么光一闪。。。果断放弃,使用最简单的算法,几分钟笔墨,错改调。(上次就是如此深陷泥潭而不可自拔): 1 void swap(int *a, int *b) 2 { 3 int tmp; 4 5 tmp = *a;
阅读全文

浙公网安备 33010602011771号