[LeetCode-Python版]Hot100(2/100)——128. 最长连续序列

题目

给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。

请你设计并实现时间复杂度为 O(n) 的算法解决此问题。

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

示例 2:
输入:nums = [0,3,7,2,5,8,4,6,0,1]
输出:9

题目链接

思路

因为题目要求O(n)的时间复杂度,所以不能排序(排序的时间复杂度是O(nlogn))
由于Python的集合是基于哈希表实现的,所以集合的搜索是O(1)的时间复杂度,因此这道题的思路是将nums转化成集合来做
遍历所有元素:
- 先看当前遍历到的元素x之前的一个元素x-1是否在集合里,如果在,就选x-1作为第一个元素而不是x(这样得到的最长数字连续序列更长)
- 找到最小的之后每次+1找下一个元素是否在集合里
最后返回结果最大值

时空复杂度

时间复杂度:O(n)
- 在二重循环中,每个元素至多遍历两次:在外层循环中遍历一次,在内层循环中遍历一次。所以二重循环的时间复杂度是 O(n) 的。比如 nums=[1,2,3,4],其中 2,3,4 不会进入内层循环,只有 1 会进入内层循环。
空间复杂度:O(n),用了一个集合

参考代码

class Solution:
    def longestConsecutive(self, nums: List[int]) -> int:
        ans = 0 #nums =[]
        st = set(nums)
        for x in st:
            if x-1 in st:
                continue
            y=x+1
            while y in st:
                y+=1
            ans = max(ans,y-x)#此时y是最长序列最后一个数的下一个数
        return ans
        
        

你可能感兴趣的:(LeetCode-Python,leetcode,python,算法)