一、题目描述

二、解题思路
我们可以使用哈希集合来优化查找效率:
-
将所有数字存入哈希集合实现去重+快速查找
-
只从连续序列的**起点(i-1是空)**开始计数
-
通过不断查找下一个连续数字来扩展序列长度
三、完整代码
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
unordered_set<int> set;
for (int& i : nums) {
set.insert(i);
}
int l = 0;
for (int i : set) {
int curi = i;
if (!set.count(i-1)) {
while (set.count(curi +1 )) {
curi++;
}
l = max(curi - i + 1, l);
}
}
return l;
}
};
四、代码解析
1. 哈希集合定义
unordered_set<int> set;
for (int& i : nums) {
set.insert(i);
}
-
使用哈希集合存储所有数字,实现O(1)时间复杂度的查找
-
自动去重,避免重复数字的影响、
2. 寻找序列起点
if (!set.count(i-1)) {
-
检查当前数字是否是某个连续序列的起点
-
只有当数字i-1不存在时,i才可能是序列起点
3. 扩展序列长度
while (set.count(curi +1 )) {
curi++;
}
-
从起点开始,不断查找下一个连续数字
-
直到找不到连续的数字为止
4. 计算并更新最大长度
l = max(curi - i + 1, l);
-
计算当前连续序列的长度
-
更新全局最大长度
五、语法要点
1. unordered_set使用
unordered_set<int> set; // 定义整型哈希集合
set.insert(value); // 插入元素
set.count(value); // 检查元素是否存在
六、执行示例
输入:[100,4,200,1,3,2]
-
数字1:1-1=0不存在 → 序列起点
-
查找2存在,3存在,4存在,5不存在
-
序列:[1,2,3,4],长度=4
-
-
数字4:4-1=3存在 → 不是起点,跳过
-
数字100:100-1=99不存在 → 序列起点
-
查找101不存在
-
序列:[100],长度=1
-
-
数字200:200-1=199不存在 → 序列起点
-
查找201不存在
-
序列:[200],长度=1
-
最终结果:4
总结
本文介绍了寻找最长连续序列的高效算法。通过使用哈希集合存储数字,我们能够快速判断数字是否存在。关键在于只从每个连续序列的起点开始扩展,避免重复计算,从而在O(n)时间复杂度内解决问题。算法首先将所有数字存入集合,然后遍历集合寻找序列起点,最后扩展序列并记录最大长度。