给定一个未排序的整数数组,找出最长连续序列的长度。
要求算法的时间复杂度为 O(n)。
示例:
输入: [100, 4, 200, 1, 3, 2]
输出: 4
解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为 4。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-consecutive-sequence
思路:
难点主要就是时间复杂度要求O(n)
正常思路是排序:
从小到大排序
遍历数组,比较相邻的两项,如果相同,则跳过,继续遍历下一项
如果 当前项+1 等于 下一项,说明遇到连续项,count +1
否则,说明连续中断,将 count 重置为 1
但是时间复杂度O(nlogn)不符合要求
哈希表
使用额外的空间O(n)哈希表存储数字,查询的时候就会变成O(1)
Set 查找元素的时间复杂度是 O(1),JS 的 Set 能给数组去掉重复元素
将数组元素存入 set 中,遍历数组 nums
如果 nums[i] - 1 存在于 set ,说明 nums[i] 不是连续序列的起点,跳过,继续遍历
当前项没有“左邻居”,它就是连续序列的起点
不断在 set 中查看 cur + 1 是否存在,存在,则 count +1
cur 不再有 “右邻居” 了,就算出了一段连续序列的长度
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
unordered_set<int> num_set;
for(int num:nums){
num_set.insert(num);
}
int max_len = 0;
for(int num:num_set){
if(!num_set.count(num-1)){
int cur_num = num;
int cur_len = 1;
while(num_set.count(cur_num+1)){
cur_num++;
cur_len++;
}
if(cur_len>max_len) max_len =cur_len;
}
}
return max_len;
}
};