第一种方法是利用set,然后以每个元素为中心,向两边扩散计算最长的连续子序列。算法复杂度为O(n)
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
int res = 0;
unordered_set<int> s(nums.begin(), nums.end());
for(int val : nums)
{
if(!s.count(val)) continue;
s.erase(val);
int pre = val-1, next = val+1;
while(s.count(pre)) s.erase(pre--);
while(s.count(next)) s.erase(next++);
res = max(res, next-pre-1);
}
return res;
}
};
第二种方法是利用hash表,将每个元素逐个插入表中,然后更新表中连续元素的数量,以一个元素为中心,向两边扩张。
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
int res = 0;
unordered_map<int, int> m;
for(int d : nums)
{
if(!m.count(d))
{
int left = m.count(d-1) ? m[d-1] : 0;
int right = m.count(d+1) ? m[d+1] : 0;
int sum = left+right+1;
m[d] = sum;
res = max(res, sum);
m[d-left] = sum;
m[d+right] = sum;
}
}
return res;
}
};