算法
文章平均质量分 84
lzshlzsh
这个作者很懒,什么都没留下…
展开
-
找出有序元素数组中指定元素出现的次数
题目: 找出有序数组中指定元素出现的次数,要求时间复杂度为O(lgn) ex, 数组{0,0,0,2,3,3,3,3,3,4,5,5},0出现3次,3出现5次正如http://blog.csdn.net/yysdsyl/archive/2010/03/26/5419482.aspx所分析,先用二分查找找到指定元素,然后往两边查找的时间复杂度为O(lgn +k),其中k为查找元素出现的次数,如果次数为n,则该方法不满足要求,因时间复杂度为O(n)。但是,我们可以先找到大于等于查找原创 2010-09-10 21:09:00 · 2149 阅读 · 0 评论 -
在旋转后的有序数组中查找元素,要求O(logn)的时间复杂度
题:比如说在A[] = {7, 8, 1, 2, 3, 4, 5, 6};查找元素。A是由{1, 2, 3, 4, 5, 6, 7, 8}左旋6位得到。假定数组旋转前是有序递增的,且没有重复的元素。方法:二分查找,再分情况讨论。在确定l, m, r后,旋转后的数组有图1所示的四种情况,且对应的元素有图2所示的关系。由图中可以看出,根据A[l]与A[r]的大小关系可以区分出第4种情况。然后根据A[l]与A[m]的关系可以区分出第1中情况。第2和第3中情况难以区分,但是如果(1)m == r,肯定是第2种情况(原创 2010-09-29 22:04:00 · 2600 阅读 · 0 评论 -
&&与||的妙用
<br />据说是EMC的笔试题<br />写一个函数int func(int i, int N){(1);},输出<br />i<br />i+1<br />...<br />N<br />N-1<br />...<br />i<br />要求用一个语句完成,不能用for,while等等。<br /> <br />#include <stdio.h>/* * give a function interface int func(int i, int N) where i <= N, * pri原创 2010-09-30 21:11:00 · 817 阅读 · 0 评论 -
byr上看到的百度面试题
北邮人上看到的,职位搜索研发:一面:1、strncpy(char* dst, char * src, int n)的实现2、两个有序数组求交集3、N个数里面查找是否存在和为m的两个数4、蚂蚁爬杆5、100层楼,球可能会在某一层楼摔坏,问用2个球,最坏情况下几次测试可以找出该楼层二面1、数据流(不知道规模),随机抽取N个样本2、百度现在收录了X亿中文网页,叫你估算网页总的数量解答:1。这个先要弄清strncpy的含义,很简单Linux下man一下就知道了,man手册还给出了实现 The strnc原创 2010-10-16 10:57:00 · 1171 阅读 · 0 评论 -
2010-10-17中科院搜狐笔试题
题1:给一个数组(1, 2, 2, 3, 4, 5),输出其所有排列,如223415, 425213等,要求一行输出一个排列,并且4不能在位置3(估计从0开始的索引号为是2,我是这样理解的),3和5不能相连。再计算输出的列数为多少?还算简单,想了想写出来了,回溯的思想。如下所示:/* * give an array of six elements: 1, 2, 2, 3, 4, 5 * print all the permutations of the array such that: * 4原创 2010-10-17 21:22:00 · 1182 阅读 · 1 评论 -
据传是google的面试题 young tableaus
今天研究了young tableus,把《算法导论》上该部分的题做了下,感觉还行。Problems 6-3: Young tableausAn m×nYoung tableau is an m×n matrix such that the entries of each row are in sorted order from left to right and the entries of each column are in sorted order from top to bottom.原创 2010-10-18 18:27:00 · 2171 阅读 · 2 评论 -
[百度面试题]100层楼,球可能会在某一层楼摔坏,问用2个球,最坏情况下几次测试可以找出该楼层
该题还可以扩展,比如说给更多的球,如3个球,多少次测试可以找出楼层。分析如下:用动态规划解这个问题设f(a, b)为a个球做b次测试可以测试到的楼层数,可以确定的楼层数即为f(a, b) + 1,因为第1层不需测试,需要测试的楼层号仅仅为[2, f(a, b) + 1]共f(a, b)层,也就是a个球b次测试可以测试到的楼层数。考虑第1次测试,测试的楼层记为x:1)如果球破了,就需要测试x下面的楼层,还剩下a-1个球b-1次测试,测试的楼层数为f(a - 1, b - 1)。2)如果球没有破,那么需要测试x原创 2010-10-19 15:36:00 · 16848 阅读 · 6 评论 -
10月23腾讯笔试递归题
题如下:计算f(m, n)f(m, n) = m + n + 1, 如果m*n = 0否则f(m, n) = f(m - 1, f(m, n - 1))程序如下,在(1)~(4)处补充语句:#include #define MAX 100int main(){ int STACK[MAX]; int top; int f; int m, n; scanf("%d%d", &m, &n); top = 0; do { if (m*n > 0){ //(1)原创 2010-10-25 22:41:00 · 1254 阅读 · 0 评论 -
POJ 1009 Edge Detection解题报告
解决该题的核心思想是:只计算包括变化点的9个点的值。设输入图像为(v0, r0), (v1, r1), ..., (vn, rn), 那么变化点为v0, v1, ..., vn。这些点的值计算出来后,后面的输出就好说。但这样的计算还是不够的,我只是找出了以下3种特殊情况,处理后就ACCEPTED了,但是我无法论证处理这几种特殊情况是结果正确的充分条件。希望有高手能论证吧。特殊情况1和2,图中红原创 2013-01-14 00:36:40 · 3429 阅读 · 0 评论 -
分析N!的末尾0的个数
结论:f(N) = f(N/5) + N/5, N >= 5f(N) = 0, N 证明:1)N 2)设对所有的小于N的数,命题成立。那么N时:N = N * ... * (5*N/5) * ... * (5*(N/5 - 1)) * ... * (5*1) * 4 * 3 * 2 * 1 = 5^(N/5) * (N/5) * (N/5 - 1) * ... * 1 * a其中a的因式分解无5。由于[5*i, 5*(i+1)] 0 应此f(N) = f(N/5) + N/5原创 2010-09-30 22:04:00 · 620 阅读 · 0 评论 -
给一串数字,输出所有的出栈序列
基本思想:递归。图1. 输入为(123)的进出栈过程对上图进行分析:在每个节点可能有两种操作:进栈,出栈。进栈则转入左子树,出栈则进入右子树。当“未处理”元素为空时,输出序列就已经确定(如图1绿色节点所示)。注意在回退时需要维护输出队列和栈的状态。程序如下:#include <iostream>#include <vector>#include <iomanip>using namespace std;void func(int A[], int j, int n, vector<in原创 2010-09-27 23:30:00 · 8792 阅读 · 2 评论 -
pku1166
<br /> <br />Description|-------| |-------| |-------|<br />| | | | | | |<br />|---O | |---O | | O |<br />| | | | | |<br />|-------| |-------| |-------|<br /> A原创 2010-09-22 23:22:00 · 712 阅读 · 0 评论 -
给定数组Arr[n],O(n)时间内找出每个元素左侧所有元素中位置最靠近该元素且大于该元素的元素
题目: http://blog.csdn.net/yysdsyl/archive/2010/03/26/5419149.aspx 给定数组Arr[n],对于其中的每个元素Arr[i](0=Arr[i],并且i-k值最小(即最靠近)。 要求O(n)时间内找出Arr中所有元素对应的Arr[k]的位置。 ex, src[]: 9, 5, 2, 4, 7 dst[]: -1,0, 1, 1, 0#include int main(){// const int原创 2010-09-11 10:07:00 · 1043 阅读 · 0 评论 -
skip list
#include #include #include #include #define INT_MIN ((int)(1原创 2010-09-09 22:31:00 · 1349 阅读 · 0 评论 -
求二叉树中节点的最大距离
参考资料下面计算的为二叉树中节点的最大距离定义为两节点间的顶点个数。Tree DiameterThe function below returns the diameter of a tree. A tree's diameter is defined after the function. Write a recurrence for this function and solve it yielding the running time using big-Oh in terms of the numb原创 2010-09-15 20:12:00 · 1255 阅读 · 0 评论 -
[Introduction to algorithm]solution to Exercises 6.5-8
Exercises 6.5-8Give an O(n lg k)-time algorithm to merge k sorted lists into one sorted list, where n is the total number of elements in all the input lists. (Hint: Use a min-heap for k-way merging.)/* * B: the result, one sorted list * A[1..k]: k sort原创 2010-09-05 20:51:00 · 1510 阅读 · 0 评论 -
最长单调上升子序列问题
问题表述:给出一个由n个数组成的序列x[1..n],找出它的最长单调上升子序列。即求最大的m和a1,a2……,am,使得a1 #include #include #include #define DEBUG#define MAX_ELEMENT_NUM 100static int search_first_larger(const int *idx, const int *A, const int e, const int number){原创 2010-09-07 20:44:00 · 2334 阅读 · 0 评论 -
pku1330 LCA问题
DescriptionA rooted tree is a well-known data structure in computer science and engineering. An example is shown below: In the figure, each node is labeled with an integer from {1, 2,...,16}. Node 8 is the root of the tree. Node x is an ancestor of node y原创 2010-09-23 20:11:00 · 1267 阅读 · 0 评论 -
2010-09-21北大创新工场笔试大题
<br />题目:<br />有两个量杯A和B,分别可以量M和N升水,还有装满水的池子,以及一个大的空杯子C,现在要经过一系列的步骤在空杯子里面量出K升水。编写程序,输入为M,N,K,输出为步骤,或者“No Solution”。例如M, N, K分别为5, 7, 4,则输出的步骤为:<br />0, 0, 0 (都没有水)<br /> <br />0, 7, 0 (B倒满水)<br />5, 2, 0 (B倒入A)<br />5, 0, 2 (原创 2010-09-22 16:56:00 · 1465 阅读 · 0 评论 -
掏宝笔试编程题
<br />题目的大概意思是,编程输出dev[1-4,a][b,c]的展开形式,如下:<br />dev1b<br />dev1c<br />dev2b<br />dev2c<br />dev3b<br />dev3c<br />dev4b<br />dev4c<br />devab<br />devac<br /> <br /> <br />解:回溯法,主要是展开[]字符有些麻烦<br /> <br />#include <iostream>#include <stack>#include <ve原创 2010-09-22 21:43:00 · 798 阅读 · 0 评论 -
POJ 1012 Joseph解题报告
我们先来分析一下原始的Joseph问题:有N个人排成一圈,编号从1到N,选择一个数M,第1个人从1开始报数,报到第M的人拉出去枪毙,他的下一位从1开始重新报数,报M的人枪毙,如此进行下去,最后剩下的一个人才可以生还。问剩下的这个人的编号是多少? 我们来看,假设第1个枪毙的人编号是m,显然m = (M - 1) % N + 1:1 2 3 .... m-1原创 2013-02-03 15:09:35 · 883 阅读 · 0 评论