LeetCode #128 Longest Consecutive Sequence 最长连续序列

128 Longest Consecutive Sequence 最长连续序列

Description:
Given an unsorted array of integers, find the length of the longest consecutive elements sequence.

Your algorithm should run in O(n) complexity.

Example:

Input: [100, 4, 200, 1, 3, 2]
Output: 4
Explanation: The longest consecutive elements sequence is [1, 2, 3, 4]. Therefore its length is 4.

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

要求算法的时间复杂度为 O(n)。

示例 :

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

思路:

要确定一个数是否存在, 需要用 set, 可以将查询时间将为 O(1)
如果一个连续子序列存在, 假定从 x开始, 长度为 result
则 x, x + 1, x + 2, ... , x + result - 1均在 set中,
第一个不在 set中的元素为 x - 1
所以从第一个 x - 1不在 set中的元素开始向后查找
时间复杂度O(n), 空间复杂度O(n)

代码:
C++:

class Solution 
{
public:
    int longestConsecutive(vector& nums) 
    {
        int result = 0;
        unordered_set s(nums.begin(), nums.end());
        for (auto num : s)
        {
            if (s.find(num - 1) == s.end())
            {
                int cur = num, temp = 1;
                while (s.find(++cur) != s.end()) ++temp;
                result = max(result, temp);
            }
        }
        return result;
    }
};

Java:

class Solution {
    public int longestConsecutive(int[] nums) {
        int result = 0;
        Set set = new HashSet<>();
        for (int num : nums) set.add(num);
        for (int num : set) {
            if (!set.contains(num - 1)) {
                int cur = num, temp = 1;
                while (set.contains(++cur)) ++temp;
                result = result < temp ? temp : result;
            }
        }
        return result;
    }
}

Python:

class Solution:
    def longestConsecutive(self, nums: List[int]) -> int:
        d, result = defaultdict(int), 0
        for num in nums:
            if not d[num]:
                result = max(cur := (left := d[num - 1]) + (right := d[num + 1]) + 1, result)
                d[num] = d[num - left] = d[num + right] = cur
        return result

你可能感兴趣的:(LeetCode #128 Longest Consecutive Sequence 最长连续序列)