LintCode:124.最长连续序列

题目:

描述

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

说明

要求你的算法复杂度为O(n)

样例

给出数组[100, 4, 200, 1, 3, 2],这个最长的连续序列是 [1, 2, 3, 4],返回所求长度 4


分析:

由题可以看出要求时间复杂度为O(n),所以排序不能使用。想到使用hashset数据结构保存数组元素,然后依次遍历数组,对于每一个数组元素,分别找到其下一个元素right和上一个元素left。以上一个元素为例,去hashset中判断是否存在该元素,如果存在,则继续找上一个元素,直到hashset中不存在该元素,返回left。同理判断下一个元素,最后返回right。然后用maxlen保存当前最长长度Max(maxlen,right-left-1),因为right和left是后判断,以100为例,上一个为99,下一个为101,set中都不存在,所以最长长度应该为101-99-1为1.

    public int longestConsecutive(int[] num) {
        // write your code here
        if(num.length==0 || num==null) return 0;
        HashSet<Integer> set=new HashSet<>();
        for(Integer i:num){
            set.add(i);
        }

        int maxLen=0;
        for(int i=0;i<num.length;i++){
            if(set.contains(num[i])) {
                set.remove(num[i]);
                int left = num[i] - 1;
                int right = num[i] + 1;
                while(set.contains(left)){
                    set.remove(left);
                    left--;
                }
                while(set.contains(right)){
                    set.remove(right);
                    right++;
                }
                if(maxLen<right-left-1){   //比如num[i]=100,left=99,right=101,set中没有,则最后maxlen应该为1,即right-left-1.因为是先减再while判断的
                    maxLen=right-left-1;
                }
            }
        }
        return maxLen;
    }

猜你喜欢

转载自blog.csdn.net/qq_27139155/article/details/80923712