完整教程:LeetCode算法刷题——128. 最长连续序列
一、题目描述

二、解题思路
我们可以使用哈希集合来优化查找效率:
将所有数字存入哈希集合实现去重+快速查找
只从连续序列的起点(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)时间复杂度内解决问题。算法首先将所有数字存入集合,然后遍历集合寻找序列起点,最后扩展序列并记录最大长度。
浙公网安备 33010602011771号