找出最大连续自然数个数
来源:互联网 发布: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表进行遍历
- 找出最大连续自然数个数
- 找出最大连续自然数个数
- 找出最长连续自然数个数
- 【实习笔试面试题】2013网易互联网实习笔试算法题-找出最大连续自然数个数
- 【实习笔试面试题】2013网易互联网实习笔试算法题-找出最大连续自然数个数
- 给定无序自然数数组,求最大连续自然数个数,时间复杂度为O(n)
- 给定无序自然数数组,求最大连续自然数个数,时间复杂度为O(n)
- 找出数组中连续的x个数,使其和最大(《编程珠玑》第八章)
- n个整数中找出连续m个数加和是最大Python版
- n个整数中找出连续m个数加和是最大Java版
- 找出连续子数组的最大和
- 找出连续子向量的最大和
- 找出最大的前K个数
- Topk找出最大的K个数
- 找出最大的数并统计个数
- 找出最大K个数,TopK问题
- 自然数序列,找出任意连续之和等于n的所有子序列
- 请找出十个最小的连续自然数,它们个个都是合数(非素数)
- POJ1011
- linux内核编译步骤与新内核启用
- 黑莓6.0列表模糊搜索高亮显示
- 用python写1个简单的聊天服务器3-TCP服务器选择
- Flex读取文件
- 找出最大连续自然数个数
- 设计模式之适配器模式
- Head First 设计模式(3)- 装饰者模式 笔记
- Oracle客户端配置及其使用说明
- Csharp:TinyMCE HTML Editor in .NET WindowsForms
- X86架构下Intel CPU的power management
- sql批量更新一个字段,全该字段等于一个固定字符串与id拼接值
- linux中无法生成core文件的解决方法
- Android实现可编辑下拉菜单