Longest Consecutive Sequence

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

posted @ 2014-06-10 15:56  秋风一片叶  阅读(147)  评论(0编辑  收藏  举报