【LeetCode最详尽解答】128_最长连续序列 Longest-Consecutive-Sequence

欢迎收藏Star我的Machine Learning Blog:https://github.com/purepisces/Wenqing-Machine_Learning_Blog。如果收藏star, 有问题可以随时与我交流, 谢谢大家!

链接:

直觉

  • 输入: nums = [100, 4, 200, 1, 3, 2]
  • 输出: 4
  • 解释: 最长的连续元素序列是 [1, 2, 3, 4]。因此它的长度是 4

首先,我们需要找到每个递增序列的起始位置,并且舍弃重复的值。所以先使用 set(nums)nums 转换为一个集合。集合中的每个值可能是起始位置,也可能只是序列的一部分。我们只需要找到起始值。

考虑列表 [1, 2, 3, 4, 5, 6]。如果不只找起始点,它会计算从 1-62-63-6 等开始的序列,导致 ( O ( n 2 ) (O(n^2) (O(n2) 的复杂度。为了确保线性时间复杂度,我们需要仅识别每个间隔的起始点。

当遇到一个值时,如果 n-1 在集合中,跳过它,因为它不是起始位置。如果 n-1 不在集合中,说明 n 是一个起始值,我们将长度初始化为 1。当 n + length 在集合中时,长度加 1。然后,将结果更新为 length 和当前结果中的最大值。

方法

我们将找到每个起始位置,并使用哈希集合存储 nums 的所有值。当我们找到一个起始位置时,我们将从这个位置计算序列的长度。然后,更新最终结果并返回它。

找到起始位置:

  • 如果 n-1 不在 numset 中,那么 n 是一个起始位置。
  • 将长度初始化为 1
  • n + lengthnumset 中时,我们增加长度。
  • 最后,用找到的最长长度更新结果。

复杂度

  • 时间复杂度:
    O ( n ) O(n) O(n)

    • 创建集合: O ( n ) O(n) O(n)
    • 遍历列表: O ( n ) O(n) O(n)
    • 检查序列的起始点并计算长度: O ( n ) O(n) O(n)
  • 空间复杂度:
    O ( n ) O(n) O(n)

    • 集合的空间: O ( n ) O(n) O(n)
    • 其他变量的空间: O ( 1 ) O(1) O(1)

代码

class Solution(object):
    def longestConsecutive(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        numset = set(nums)
        longest = 0
        for n in nums:
            # calculate just from the starting position
            if n-1 not in numset:
                length = 1
                while n + length in numset:
                    length+=1
                longest = max(longest, length)
        return longest
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值