Leetcode128. 最长连续序列

134 阅读1分钟

要求:

给定一个未排序的整数数组,找出最长连续序列的长度。 要求算法的时间复杂度为 O(n)。

示例:

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

思路:

先对数组进行去重吧,所以先把所有数据都传到一个HashSet中,而且利用HashSet的contains方法,时间复杂度是O(1);从前往后遍历整个数组,当前遍历到的数是num,就在HashSet中找num-1,如果找到了就再判断是否有num+1这个数,有就将数组长度加一,使用while不断循环判断。

因为如果一个数组中存在一个序列num,num+1,num+2,num+3和num-1,num,num+1,num+2,num+3,那么必然是取后一个序列。但是如果先对前面一个序列进行了判断,再对后一个序列进行判断,其实就是在做重复的工作了,所以每次遍历的时候,如果HashSet中不包含num-1,就说明num会是一个可能存在的连续序列的起始元素,满足这个条件才会进入第二个循环判断。

第二个判断就是看HashSet是否包含当前num+1这个元素,只要包含就把序列长度加一,同时当前元素也加一。

代码:

class Solution {
    public int longestConsecutive(int[] nums) {
        Set<Integer> setNum = new HashSet<>();
        for (int num : nums) {
            setNum.add(num);
        }
        int longestAmount = 0;
        for (int num : nums) {
            if (!setNum.contains(num-1)) {
                int currentNum = num;
                int currentAmount = 1;
                while (setNum.contains(currentNum+1)) {
                    currentAmount++;
                    currentNum++;
                }
                longestAmount = Math.max(longestAmount, currentAmount);
            }
        }
        return longestAmount;
    }
}