找出最大连续自然数个数

来源:互联网 发布:mac免费解压软件百度云 编辑:程序博客网 时间:2024/05/16 16:56

本题为网易互联网暑期实习生笔试算法题。


以下参考答案为自己搜集网上资料以及同学讨论所得,如有错误,还请指出。欢迎来信交流!


题目:


 一个无序自然数数组,比如[100,2,1,3]求在0(n)时间复杂度内求出最大的连续自然数个数:输出应该是3,要求算法的时间复杂图为O(n)

思路:
1. 遍历数组,找到数组中自然数的最大值,如[100,2,1,3],找到100,这里是为了得到hash表的长度,节省空间,时间复杂    度为O(n)
2.遍历数组,将数组中的元素以下标的形式映射到hash表中,对于[100,2,1,3],有hash[100]=1,hash[2]=1,hash[1]=1,hash[3]=1,如果数组中有相同元素,忽略,时间复杂度为O(n)
3.此后,hash表中的数据为多个连续的1序列,对于[100,2,1,3],有hash = [1 1 1 0 0 0 0 0 ... 1],之后计算出hash表中最长的连续1序列的长度即可
4.要得到hash表中最长的连续1序列的长度,最简单的方法为遍历该hash表,但遍历的话时间复杂度为O(N)(N为数组中最大元素),与题目要求不符。
5.按照我的想法,遍历原数组,找到原数组中为hash表中连续1序列起点的元素(其中,hash表中连续1序列长度为1的元素舍弃),对于[100,2,1,3],找到1(100被舍弃)。另外一个例子[50,2,2,3,4,1,1,49,51],找到两个连续1序列起点,即1和49,该元素的特征为:对于连续1序列的起点i,有hash[i]=1 && (i==N ||hash[i+1]==1) && (i==1 || hash[i-1]==0) 这一步骤的时间复杂度为O(n)
6.对于每一个连续1序列起点i, 令最大长度为Maxlength=1,point=i,length=1,然后point=point+1,如果hash[point]==1,length=length+1,否则测试length是否大于Maxlength,如果是则更新Maxlength的值;然后令point为下一个连续1序列的起点,直到所有连续1序列的起点都遍历完毕。由于在步骤5中,我们得到的连续1序列长度必定>=2,且该序列的元素都在原数组中,并且步骤5还去掉了长度为1(即孤立)的元素,所以本步骤的时间复杂度<O(n)
总的时间复杂度为O(n)+O(n)+O(n)+O(n)=O(4n)=O(n)

总结:由于题目要求时间复杂度O(n)中的n应该是原数组的长度,所以应该避免直接对hash表进行遍历
原创粉丝点击