124. 最长连续序列

描述

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

说明

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

样例

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

思路

我们在判断某个数的连续序列时,会分别往减小和增大的方向找下一个连续数在不在数组中。那么我们如何判断我们要寻找的下一个数在不在数组中呢?我们可以先建立一个HashSet,先用HashSet消除数组中的重复元素(相同的两个数只能使连续序列的长度+1),然后查找HashSet中是否包含我们要寻找的下一个元素,包含则长度+1,继续往下寻找,不包含则这个寻找方向就没办法继续了。最后把两个方向的长度加起来即为包含该数的一个连续序列。

代码

public class Solution {
    /**
     * @param nums: A list of integers
     * @return an integer
     */
    public int longestConsecutive(int[] nums) {
        HashSet set = new HashSet<>();
        for (int i = 0; i < nums.length; i++) {
            set.add(nums[i]);
        }
        
        int longest = 0;
        for (int i = 0; i < nums.length; i++) {
            int down = nums[i] - 1;
            while (set.contains(down)) {
                // 同一序列中的所有元素,不管从哪个开始进行down和up的查找,找到的最终都是同一个序列,为了避免重复运算,要移除set中已经查过的down和up
                set.remove(down);
                down--;
            }
            
            int up = nums[i] + 1;
            while (set.contains(up)) {
                set.remove(up);
                up++;
            }
            
            // 注意上面多执行了一次down--,所以此次要用up - (down + 1)
            longest = Math.max(longest, up - down - 1);
        }
        
        return longest;
    }
}

你可能感兴趣的:(124. 最长连续序列)