题目:给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。

请你设计并实现时间复杂度为 O(n) 的算法解决此问题。

思路:找出一个数x,不断判断其x+1是否存在,存在则长度加1,当这样外层循环遍历加上内层循环遍历,时间复杂度会达到o(n^2)。

所以我们可以在遍历的时候判断x-1是否存在数组中,如果存在我们就不需要遍历数组了,直接跳过,防止重复遍历。

class Solution {
    public int longestConsecutive(int[] nums) {
        //首先对数组去重
        Set<Integer> num_set = new HashSet<>();
        for(int i = 0; i < nums.length; i++){
            num_set.add(nums[i]);
        }
        //初始化最长长度
        int longestStreak = 0;
        //遍历去重后的数组
        for(int num : num_set){
            //如果集合中包含 x - 1则跳过
            if(!num_set.contains(num - 1)){
                //记录当前数
                int currentNum = num;
                //当前长度为1
                int currentStreak = 1;
                //如果数组中包含x + 1不断循环
                while(num_set.contains(currentNum + 1)){
                    //当前数不断加1,不断查找x+1是否存在
                    currentNum += 1;
                    //存在x+1,则将当前长度加1
                    currentStreak +=1;
                }
                 longestStreak = Math.max(longestStreak,currentStreak);
            }
        }
        return longestStreak;
    }
}