题目描述
给定一个未排序的整数数组 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
解法
1.哈希表
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
if(nums.empty()) return 0;
int ans = 0,st = 0,ma = -1e9,mi = 1e9;
unordered_map <int,int> m;
for(int num : nums){
if(num > ma) ma = num;
if(num < mi) mi = num;
m[num] ++;
}
for(int i = mi;i <= ma;i ++){
if(m[i] == 0)
ans = max(ans,st);
st = 0;
}
else{
st ++;
}
}
ans = max(ans,st);
return ans;
}
};
哈希表的这种方法,时间复杂度为0(N),空间复杂度过不去。
2.集合set
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
if(nums.empty()) return 0;
int ans = 0,n = 0,currentNum;
unordered_set<int> st(nums.begin(),nums.end());
for(int num : nums){
// 只有当num是序列起点时才检查(num-1不存在)
if(st.find(num - 1) == st.end()){
currentNum = num;
n = 1;
}
else{
// 向后查找连续的数字
while(st.find(currentNum + 1) != st.end()){
currentNum ++;
n ++;
}
ans = max(ans,n);
}
}
return ans;
}
};