← 返回编程题库
coding-longest-consecutive-sequence-hash中等免费版2000ms未尝试

最长连续整数序列(哈希集合)

Longest Consecutive Sequence (Hash Set)

开始编码

一个行情工程师在审计交易所的成交 ID 流。每笔成交带一个单调递增的整数 trade ID,但她拿到的日志被几层队列打乱过、还可能因为回放出现重复。她想知道日志中实际存在的最长连续 trade ID 段——这是一个快速的链路健康指标,能反映 pipeline 没丢任何一笔的最长连续区间有多长。请实现这个原语。

请实现 solution(nums: list[int]) -> int。给定一个无序整数列表(可能有重复、可能有负数、可能为空),返回最长连续整数段的长度。两个整数「连续」是指相差恰好 1;长度为 k 的连续段对应 k 个不同的值 v, v+1, …, v+k−1,且每个值都必须出现在 nums 中。重复元素不会让连续段变长。

示例 1solution([100, 4, 200, 1, 3, 2]) 返回 4。整数 1, 2, 3, 4 都出现并构成长度 4 的连续段;100200 各自是长度 1 的孤立点。示例 2solution([0, 3, 7, 2, 5, 8, 4, 6, 0, 1]) 返回 9——0..8 全在(重复的 0 没贡献)。示例 3solution([]) 返回 0solution([42]) 返回 1solution([5, 5, 5]) 返回 1(去重后只有一个值)。

朴素做法「先排序再扫一遍」是 O(n log n),n=10⁵ 时也跑得动,但达不到规格要求的 O(n)。标准 O(n) 技巧是哈希集合 + 起点过滤:用集合做 O(1) 成员查询,只从「连续段起点」开始扩展(即 n 满足 n−1 不在集合中时,才往后展开 n, n+1, n+2 …)。这样每个连续段恰好被走一次,整个算法每个元素至多被访问两次,均摊 O(n) 时间、O(n) 空间。

约束条件

  • 0 ≤ len(nums) ≤ 100000
  • -10⁹ ≤ nums[i] ≤ 10⁹(接近 32 位有符号范围,Python int 无压力)
  • 允许重复,但同一个值在任何连续段中只能贡献一次长度
  • 空列表返回 0
  • 目标复杂度:O(n) 时间、O(n) 额外空间(哈希集合)

样例

Case 1 · empty list

输入: [[]]

期望: 0

空列表里不存在任何数,最长连续段长度按定义为 0。

Case 2 · single element

输入: [[42]]

期望: 1

只有一个数,单独构成一个长度 1 的段。

Case 3 · classic LC128 [100,4,200,1,3,2]

输入: [[100,4,200,1,3,2]]

期望: 4

1, 2, 3, 4 全部出现,构成长度 4 的连续段;100 与 200 是孤立点。注意起点必须满足 n-1 不在集合中(这里 1 是起点,因为 0 不在)。

最近提交

还没有提交记录。

编码区

实现 solution(...)。本地运行当前支持 Python 可见样例;服务端提交会运行可见样例和隐藏测试。

加载编辑器...
计时0:00

默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。

Case 1 · empty list

输入: [[]]

期望: 0

空列表里不存在任何数,最长连续段长度按定义为 0。

Case 2 · single element

输入: [[42]]

期望: 1

只有一个数,单独构成一个长度 1 的段。

Case 3 · classic LC128 [100,4,200,1,3,2]

输入: [[100,4,200,1,3,2]]

期望: 4

1, 2, 3, 4 全部出现,构成长度 4 的连续段;100 与 200 是孤立点。注意起点必须满足 n-1 不在集合中(这里 1 是起点,因为 0 不在)。