最长连续序列

QUESTION:

给定一个未排序的整数数组,找出最长连续序列的长度。

要求算法的时间复杂度为 O(n)。

示例:

输入: [100, 4, 200, 1, 3, 2] 输出: 4 解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为 4

EXPLANATION:

首先看到要求的就是O(n)的时间复杂度,那么就不能采用多循环的方式,所以想到的思路就是用hashset来记录。
思路:
1.循环数组,用hashset来进行去重
2.再次进行循环,当n-1不存在时,那么可以循环查找n+1是否存在,这样就可以找到一个连续的,同时保证了一个连续只循环一次
3.将连续的结果和result进行比对
4.循环结束返回result

这样的时间复杂度就是第一个for循环n+第二个for循环n*hashset的O(1)查找。最后结果就是O(n)了,同时发现在jdk8中的hashset增加了hash碰撞的红黑树,所以会快很多。

SOLUTION:

class Solution {
    public int longestConsecutive(int[] nums) {
        Set<Integer> set = new HashSet<>();
        for(int n : nums) set.add(n);
        int result = 0;
        for(int n:nums){
            if(!set.contains(n-1)){
                int curN = n;
                int tmp = 1;

                while (set.contains(curN+1)){
                    curN++;
                    tmp++;
                }
                result = Math.max(result,tmp);
            }
        }
        return result;
    }
}