Given an unsorted array of integers, find the length of the longest consecutive elements sequence.
For example,
Given [100, 4, 200, 1, 3, 2]
,
The longest consecutive elements sequence is [1, 2, 3, 4]
. Return its length: 4
.
Your algorithm should run in O(n) complexity.
排序的时间复杂度是O(nlgn),因此不能用排序,想到了哈希表,因为哈希表查找的时间复杂度是O(1),考虑用HashMap做,key表示原数组中的每一个数值,value表示从key开始连续出现的数最大值,在维护这个map的时候遇到了问题,更新key所对应的value时要遍历,因此增加了复杂度,使得复杂度为O(n^2),还不如排序呢,毫无疑问的超时了,o(╯□╰)o。
看了一些解法,考虑用HashSet,每次找出一个元素,然后找到所有连续的比它小的,删除,然后找到所有连续的比它大的,删除,这个过程中统计长度,并更新最长的长度,重复上述过程直到集合为空
代码如下:
1 public int longestConsecutive(int[] num) { 2 if (num == null || num.length == 0) { 3 return 0; 4 } 5 Set<Integer> set = new HashSet<Integer>(); 6 for (int i : num) { 7 set.add(i); 8 } 9 int max = 0; 10 while (!set.isEmpty()) { 11 int maxLength = 0; 12 int now = ((Integer) set.toArray()[0]).intValue(); 13 for (int i = now + 1; i > Integer.MIN_VALUE && set.contains(i - 1); i--) { 14 maxLength++; 15 set.remove(i - 1); 16 } 17 for (int i = now; i < Integer.MAX_VALUE && set.contains(i + 1); i++) { 18 maxLength++; 19 set.remove(i + 1); 20 } 21 max = max > maxLength ? max : maxLength; 22 } 23 return max; 24 }
在上面的代码中有个疑问,就是在hashset中随机取元素的问题,在这里就是取转化为数组之后的第1个元素,因为hashset没有提供像list这样的方法,每次将set转化为数组的时候会消耗一定的时间,这样复杂度是不是还是O(n^2)????,改进一下,从原数组中取每一个元素在hashset中查找,这样会省去转化的时间,但是会增加遍历次数,看看效果吧,实际结果是从456ms增加到了460ms,本打算减少时间的,结果变成了增加时间了,o(╯□╰)o