题目描述
给定一个未排序的整数数组 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
提示:
- $0 \leq nums.length \leq 10^5$
- $-10^9 \leq nums[i] \leq 10^9$
解题思路
哈希法
这道题要求求解最长的连续序列,序列中的元素是整数。最容易想到的办法就是暴力解法,对于每一个元素去查找它的后继元素是不是在所给的整数数组中,但是这样的时间复杂度很高。对于其中判断后继元素在不在整数数组中的时候,我们可以用哈希表去优化它,这样可以减少一次遍历的时间复杂度。
如果只是优化到这一步的话,时间复杂度仍然很高。我们还发现,这样的遍历过程中会有大量的重复计算过程。比如,在整数数组中如果存在元素[2,3,4]
的话,对元素3
和元素4
是没有必要重复运算的,因为它一定在对2
进行处理的时候包含进去了。所以,我们可以先判断要处理的元素是不是是所给整数数组中某个元素的后继(也就是说要处理的元素的前继元素在不在数组中),如果是的话,可以跳过这个元素。这样的话,时间复杂度可以优化到$O(n)$。
参考代码
int longestConsecutive(vector<int>& nums){
unordered_set<int>nums_set;
for(auto &num : nums){
nums_set.insert(num);
}
int curLength=0;
int longestLength=0;
for(auto &num : nums){
if(nums_set.count(num-1)){
continue;
}
if(!nums_set.count(num-1)){
curLength = 1;
}
int index = num + 1;
while(nums_set.count(index)){
curLength++;
index++;
}
longestLength = curLength > longestLength ? curLength : longestLength;
}
return longestLength;
}
复杂度分析
时间复杂度:$O(n)$
空间复杂度:$O(n)$
文章评论