题目描述
给定一个未排序的整数数组,找出最长连续序列的长度。
要求算法的时间复杂度为 O(n)
。
示例:
输入: [100, 4, 200, 1, 3, 2]
输出: 4
解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为 4。
解题思路
本题要求时间为O(n)
,即扫描一遍就需要得出结果。
可以采用哈希表的原理,采用unorded_set即可,按照以下步骤计算:
- 将
nums
中的数据放入set
中; - 对于
nums
中的每个数nums[i]
,若nums[i]-1
已经在set
中,则继续扫描下一个数; - 若
nums[i]-1
不在set
中,则查找nums[i]+1
,直到找不到为止,最终返回最大的max_length
。
比较巧妙的地方就是查找nums[i]-1
,如果存在的话就按照nums[i]-1
的结果返回max_length
即可,减少了时间复杂度。
具体实现过程可参考代码及注释。
完整代码
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
//定义一个集合,用于查重
unordered_set<int>set;
//将nums中的数据出入到set中
for(int i = 0;i<nums.size();i++){
set.insert(nums[i]);
}
//对于nums中的每个数nums[i],若nums[i]-1已经在set中,则继续扫描下一个数
//若nums[i]-1不在set中,则查找nums[i]+1,直到找不到为止,最终返回最大的length
int max_length = 0;
for(int i = 0;i<nums.size();i++){
//先找nums[i]-1
if(set.count(nums[i]-1) == 0){
int current_length = 1;
int current_number = nums[i] + 1;
//再找nums[i] + 1
while(set.count(current_number) == 1){
current_length += 1;
current_number += 1;
}
max_length = max(max_length, current_length);
}
}
return max_length;
}
};