给定无序自然数数组,求最大连续自然数个数,时间复杂度为O(n)
来源:互联网 发布:淘宝2016好评返现新规 编辑:程序博客网 时间:2024/05/17 03:22
方法1:排序,然后遍历,复杂度n lg n。
方法2:并查集。用一个hash table记录数据是否出现,一个数组用于实现并查集。每次加入数据x,check 一下哈希table中x-1和x+1是否合法并存在,若存在则合并。最后遍历并查集数组,输出最大的等价类中元素的个数即可。
方法3:类似2,用多个hash table:
维持两个hash表tables:
Start表,其中的条目都是如下格式(start-point,length),包含的某个连续序列起始数以及序列长度。
End表,其中的条目都是如下格式(end-point,length),包含的某个连续序列结束数以及序列长度。
扫描原始数组,做如下操作: 对于当前值value,
判断value + 1是否存在于start表中。
如果存在,删除相应的条目,创建一个新条目(value,length + 1),同时更新end表相应条目,结束数不变,该对应长度加一。
判断value - 1是否存在于end表中。 如果存在,删除相应的条目,创建一个新条目(value,length + 1),同时更新start表相应条目,开始数不表,该对应长度加一。 如果在两个表中都存在,则合并两个已经存在的连续序列为一个。将四个条目删除,新建两个条目,每两个条目代表一个连续序列。 如果都不存在,则只需要在两个表中创建一个新的长度为1的条目。 一直这样等到数组中所有元素处理完毕,然后扫描start表寻找length值最大的那个即可。 这里要达到O(n)时间复杂度,start表和end表都用hash表实现,而且必须满足相关操作查找/添加/删除能够在O(1)时间复杂度内完成。
实例分析:
int[] input = {10,21,45,22,7,2,67,19,13,45,12, 11,18,16,17,100,201,20,101};
初始化状态:
Start table:{}
End table:{}
开始遍历数组:
10:两个数组中都不存在,添加条目。
Start table:{(10,1)}
End table:{(10,1)}
21:两个数组中都不存在,添加条目。
Start table:{(10,1),(21,1)}
End table:{(10,1),(21,1)}
45:两个数组中都不存在,添加条目。
Start table:{(10,1),(21,1),(45,1)}
End table:{(10,1),(21,1),(45,1)}
22:22-1=21存在于end表中需要进行更新。
Start table:{(10,1),(21,2),(45,1)}
End table:{(10,1),(22,2),(45,1)}
7:两个数组中都不存在,添加条目。
Start table:{(10,1),(21,2),(45,1),(7,1)}
End table:{(10,1),(22,2),(45,1),(7,1)}
2:两个数组中都不存在,添加条目。
Start table:{(10,1),(21,2),(45,1),(7,1),(2,1)}
End table:{(10,1),(22,2),(45,1),(7,1),(2,1)}
67:两个数组中都不存在,添加条目。
Start table:{(10,1),(21,2),(45,1),(7,1),(2,1),(67,1)}
End table:{(10,1),(22,2),(45,1),(7,1),(2,1),(67,1)}
19:两个数组中都不存在,添加条目。
Start table:{(10,1),(21,2),(45,1),(7,1),(2,1),(67,1),(19,1)}
End table:{(10,1),(22,2),(45,1),(7,1),(2,1),(67,1),(19,1)}
13:两个数组中都不存在,添加条目。
Start table:{(10,1),(21,2),(45,1),(7,1),(2,1),(67,1),(19,1),(13,1)}
End table:{(10,1),(22,2),(45,1),(7,1),(2,1),(67,1),(19,1),(13,1)}
45:两个数组中都不存在,添加条目。
Start table:{(10,1),(21,2),(45,1),(45,1),(7,1),(2,1),(67,1),(19,1),(13,1)}
End table:{(10,1),(22,2),(45,1),(45,1),(7,1),(2,1),(67,1),(19,1),(13,1)}
12:12+1=13存在start表中,更新。
Start table:{(10,1),(21,2),(45,1),(45,1),(7,1),(2,1),(67,1),(19,1),(12,2)}
End table:{(10,1),(22,2),(45,1),(45,1),(7,1),(2,1),(67,1),(19,1),(13,2)}
11:11+1=12都存在,合并。
Start table:{(10,4),(21,2),(45,1),(45,1),(7,1),(2,1),(67,1),(19,1)}
End table:{(13,4),(22,2),(45,1),(45,1),(7,1),(2,1),(67,1),(19,1)}
18:18+1=19存在start表中,更新。
Start table:{(10,4),(21,2),(45,1),(45,1),(7,1),(2,1),(67,1),(18,2)}
End table:{(13,4),(22,2),(45,1),(45,1),(7,1),(2,1),(67,1),(19,2)}
16:都不存在,添加条目。
Start table:{(10,4),(21,2),(45,1),(45,1),(7,1),(2,1),(67,1),(18,2),(16,1)}
End table:{(13,4),(22,2),(45,1),(45,1),(7,1),(2,1),(67,1),(19,2),(16,1)}
17:都存在,合并。
Start table:{(10,4),(21,2),(45,1),(45,1),(7,1),(2,1),(67,1),(16,4)}
End table:{(13,4),(22,2),(45,1),(45,1),(7,1),(2,1),(67,1),(19,4)}
100:都不存在,添加条目。
Start table:{(10,4),(21,2),(45,1),(45,1),(7,1),(2,1),(67,1),(16,4),(100,1)}
End table:{(13,4),(22,2),(45,1),(45,1),(7,1),(2,1),(67,1),(19,4),(100,1)}
201:都不存在,添加条目。
Start table:{(10,4),(21,2),(45,1),(45,1),(7,1),(2,1),(67,1),(16,4),(100,1),(201,1)}
End table:{(13,4),(22,2),(45,1),(45,1),(7,1),(2,1),(67,1),(19,4),(100,1),(201,1)}
20:都存在,合并。
Start table:{(10,4),(16,7),(45,1),(45,1),(7,1),(2,1),(67,1),(100,1),(201,1)}
End table:{(13,4),(22,7),(45,1),(45,1),(7,1),(2,1),(67,1),(100,1),(201,1)}
101:都存在,合并。
Start table:{(10,4),(16,7),(45,1),(45,1),(7,1),(2,1),(67,1),(100,1),(201,1),(101,1)}
End table:{(13,4),(22,7),(45,1),(45,1),(7,1),(2,1),(67,1),(100,1),(201,1),(201,1)}
最后搜索start表,找到length值最大的,为7.连续自然数序列是:(16,17,18,19,20,21,22). 结束。
- 给定无序自然数数组,求最大连续自然数个数,时间复杂度为O(n)
- 给定无序自然数数组,求最大连续自然数个数,时间复杂度为O(n)
- 求数组中连续最大和值,时间复杂度为O(n)
- 1~n无序数组时间复杂度为O(n)排序
- 1~n无序数组时间复杂度为O(n)排序
- 找出最大连续自然数个数
- 找出最大连续自然数个数
- 有1,2...一直到n的无序数组,求排序算法,并且要求时间复杂度为O(n),时间复杂度为O(1)
- C/C++ | 27-18 n的无序数组,求排序算法,并且要求时间复杂度为O(n)
- 有1,2,....一直到n的无序数组,求排序算法,要求时间复杂度为O(n),空间复杂度O(1)
- 有1,2,…,n的无序数组,求排序算法,并且要求时间复杂度为O(n),空间复杂度O(1),一次只能交换两个数
- 有1,2,....一直到n的无序数组,求排序算法,要求时间复杂度为O(n),空间复杂度O(1)
- 无序序列中O(n)时间复杂度寻找最小(最大)的K个数
- 无序整形数组,如何找到最长连续序列长度,时间复杂度O(n)
- 数组进行排序,时间复杂度O(N)&&求无序数组的中位数
- 和为n的连续自然数序列
- 求一个数组的中位数时间复杂度为O(n)
- 给定无序数组求连续字串最大和
- 在二元树中找出和为某一值的所有路径
- Android平台下基于XMPP的IM研究
- <一>初探js特效魅力之选项卡05
- 九度online judge 1543 二叉树
- Git 的origin和master分析
- 给定无序自然数数组,求最大连续自然数个数,时间复杂度为O(n)
- 搭建XMPP协议,实现自主推送消息到手机
- 快速排序算法笔记
- 重叠的最长子串 (扩展KMP算法)(滚动哈希算法--Rabin-Karp算法)
- 线刷版Recovery5.0.0.7调整System大小
- Core Text Tutorial for iOS: Making a Magazine App(中文)
- OCP-1Z0-053-V12.02-79题
- js的简单模板解析
- jiqiao