Given an unsorted array of integers, find the length of the longest consecutive elements sequence.
Your algorithm should run in O(n) complexity.
Example:
Input: [100, 4, 200, 1, 3, 2]
Output: 4
Explanation: The longest consecutive elements sequence is [1, 2, 3, 4]
. Therefore its length is 4.
分析:
如果我们要找最长连续序列,以3为例,我们会从两个方向找,即3+1和3-1两个方向,一直延伸下去直到找不到为止,1<-2<-3->4,这样我们如果从3开始,就得到3的连续最长序列是4。同样的,如果我们找4的最长连续序列,1<-2<-3<-4,4的最长连续序列也是4,可以发现,我们上面进行了重复的计算,因为1,2,3,4这个连续序列里,每个数的最长连续序列大小都等于4。于是我们可以做出优化,用哈希表存储所有值,如果该数在最长连续序列中,则从哈希表里删除,避免重复计算。
代码:
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
if(nums.empty())
return 0;
unordered_set<int> s(nums.begin(), nums.end());
int max=1;
for(int n:nums)
{
if(s.find(n)==s.end()) continue;
s.erase(n);
int pre=n-1;
int next=n+1;
int sum=1;
while(s.find(pre)!=s.end())
{
++sum;
s.erase(pre);
--pre;
}
while(s.find(next)!=s.end())
{
++sum;
s.erase(next);
++next;
}
max = max>sum?max:sum;
}
return max;
}
};