目录
1.题目
给定一个未排序的整数数组 nums
,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n)
的算法解决此问题。
示例 1:
输入:nums = [100,4,200,1,3,2] 输出:4 解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。
示例 2:
输入:nums = [0,3,7,2,5,8,4,6,0,1] 输出:9
示例 3:
输入:nums = [1,0,1,2] 输出:3
提示:
0 <= nums.length <= 105
-109 <= nums[i] <= 109
2.代码
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
unordered_set<int> num_set;
for(int i=0;i<nums.size();i++)
{
num_set.insert(nums[i]);
}
int maxx = 0;
for(auto it = num_set.begin();it!=num_set.end();it++)
{
int num = *it;
if(!num_set.count(num-1))
{
int cur_num = num;
int len = 1;
while(num_set.count(cur_num+1))
{
cur_num = cur_num + 1;
len = len + 1;
}
maxx = max(maxx,len);
}
}
return maxx;
}
};
3.代码解释
3.1.核心思路:
-
利用哈希集合(
unordered_set
)快速查找元素,避免重复处理。 -
仅当元素是某个连续序列的起点时,才向后扩展计算序列长度,确保时间复杂度为O(n)。
3.2.步骤解析:
-
去重处理:将输入数组存入哈希集合,去除重复元素。
-
遍历集合元素:对于每个元素
num
,检查num-1
是否存在于集合:-
若不存在,则
num
是某连续序列的起点。
-
-
扩展序列:从起点
num
开始,逐次检查num+1
、num+2
...是否存在,统计序列长度。 -
更新最大值:每次计算完序列长度后,更新全局最大值
maxx
。