leetcod:最长连续序列(python)

1. 题目描述

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

示例:

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

2. 思路

参考

https://leetcode-cn.com/problems/longest-consecutive-sequence/solution/zui-chang-lian-xu-xu-lie-by-leetcode/

2.1 暴力穷举

遍历nums 数组中的每一个数字,并将该数字作为连续序列的第一个数字,枚举后面的数字,直到有数字在原数组中没出现过。当枚举到数组中没有的数字时,记录下序列的长度,并更新当前最优解。

会超时

class Solution:
    def longestConsecutive(self, nums: List[int]) -> int:
        res = 0
        for i in nums:
            count = 0
            j = i
            while j in nums:
                count += 1
                j += 1
            res = max(res,count)
        return res

2.2 先排序,再找

时间复杂度为o(nlogn)
class Solution:
    def longestConsecutive(self, nums: List[int]) -> int:
        if nums == []:
            return 0
        nums.sort()
        maxlen = 1
        curlen = 1
        for i in range(1,len(nums)):
            if nums[i] != nums[i-1]:   # 如果有重复的数字,长度算1
                if nums[i] == nums[i-1]+1:
                    curlen += 1
                    maxlen = max(maxlen,curlen)
                else:
                    maxlen = max(maxlen,curlen)
                    curlen = 1
        return maxlen

2.3 利用set

空间换时间,借助一个set集合,对暴力方法进行优化。

class Solution:
    def longestConsecutive(self, nums: List[int]) -> int:
        if len(nums) == 0:
            return 0
        numset = set(nums)
        maxlen = 0
        for num in numset:   
            curlen = 1
            if num - 1 not in numset:  
            # 只有当num是一个序列的端点时,在进行循环,复杂度为o(n+n)= o(n)
                while num + 1 in numset:
                    curlen  += 1
                    num += 1 
                maxlen = max(maxlen,curlen)
        return maxlen

你可能感兴趣的:(leetcode)