【Leetcode Hot 100 题目精华解析2025】python自用 --128.最长连续序列

128.最长连续序列

要实现 O(n) 时间复杂度,我们需要避免排序(排序是 O(n log n)),通常的做法是用 哈希集合 (set) 进行常数时间的查找。

解题思路

1、去重 + 放入哈希集合

我们用 set(nums) 保存所有数字,这样查找一个数是否存在是 O(1)。

2、只从“连续序列的起点”开始向后找

如果 x - 1 不在集合中,说明 x 是一个连续序列的开头。(if)

然后从 x 往后找 x+1, x+2, ...,直到找不到为止,计算长度。(while)

3、记录最大长度

在遍历所有起点时更新最大值。(max)

代码实现

def longestConsecutive(nums):
    if not nums:
        return 0

    num_set = set(nums)
    longest = 0

    for num in num_set:
        # 只从连续序列的起点开始
        if num - 1 not in num_set:
            current = num
            length = 1
            # 向后找连续的数字
            while current + 1 in num_set:
                current += 1
                length += 1
            longest = max(longest, length)

    return longest

测试

print(longestConsecutive([100, 4, 200, 1, 3, 2]))  # 4
print(longestConsecutive([0, 3, 7, 2, 5, 8, 4, 6, 0, 1]))  # 9
print(longestConsecutive([1, 0, 1, 2]))  # 3

核心要点

O(n) 的关键是:

  • 用 set 做 O(1) 查找
  • 只从“连续序列的起点”开始向后找,避免重复计数空间复杂度为 O(n)(哈希集合存储所有元素)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值