最长连续整数序列(哈希集合)
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 中。重复元素不会让连续段变长。
示例 1:solution([100, 4, 200, 1, 3, 2]) 返回 4。整数 1, 2, 3, 4 都出现并构成长度 4 的连续段;100 和 200 各自是长度 1 的孤立点。示例 2:solution([0, 3, 7, 2, 5, 8, 4, 6, 0, 1]) 返回 9——0..8 全在(重复的 0 没贡献)。示例 3:solution([]) 返回 0;solution([42]) 返回 1;solution([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 可见样例;服务端提交会运行可见样例和隐藏测试。
默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。
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 不在)。