找到数组中最长的连续序列的长度

题目描述

给定一个无序的整数类型数组,求最长的连续元素序列的长度。

例如:

给出的数组为[100, 4, 200, 1, 3, 2],

最长的连续元素序列为[1, 2, 3, 4]. 返回这个序列的长度:4

你需要给出时间复杂度在O(n)之内的算法

分析

这道题令我想起之前做过的一道题,是要在数组里面找到一个连续的子序列,这个序列能使元素和最大:这一题的解决办法是,遍历数组,如果后一个元素大于 目前的序列和加上这个再新的元素的记过,那么变量记录由这个新元素开始继续往后的序列和;不满足以上条件这个序列就不换。
但是这道题是要找到最长的连续元素序列,可以不是连续的,虽然看上去很像但是解决方法不同。方法是用哈希表把数组的元素放进去,然后第二次遍历数组,如果元素在表内,就删除,同时如果能找到他相邻的数也删除,这样子删除的元素个数就是关于当前元素的连续序列个数。最后要最大的就可以了。

时间复杂度
O(n)

代码

import java.util.HashSet;
public class Solution {
    public int longestConsecutive(int[] num) {
        //以空间换时间,将数组元素放进列表
        //第二次遍历,如果当前数组元素在表里,删除,如果有和他相邻的数那么也删除
        //记录下这一趟删除了多少元素就是这个连续的序列的数,最后取最长的
        if(num.length<2)return num.length;
        HashSet<Integer> map = new HashSet<>(); 
        for(int n:num)
            map.add(n);
        int max = 0;
        for(int n:num){
            while(map.remove(n)){//如果有这个元素
                int left = n, right = n;
                while(map.remove(left-1))left--;//找比他小的
                while(map.remove(right+1))right++;//找比他大的
                max = Math.max(max, right-left+1);
            }
        }
        return max;
    }
}

你可能感兴趣的:(leetcode)