Given an unsorted array of integers, find the length of the longest consecutive elements sequence.
For example,
Given [100, 4, 200, 1, 3, 2]
,
The longest consecutive elements sequence is [1, 2, 3, 4]
. Return its length: 4
.
Your algorithm should run in O(n) complexity.
题目解析:
(1)这里主要用到了unordered_set的数据结构 他将数组的元素机型hash,因此有很快的访问速度。
(2)针对每一个元素查找它左右的元素,并将他们从集合中去除。这样每个元素都可以得到针对这个元素的连续序列的长度。
(3)在所有连续中挑选一个最长的就可以了。
#include <iostream>
#include <vector>
#include <unordered_set>
using namespace std;
int longestConsecutive(vector<int> &num) {
unordered_set<int> map;
for(unsigned int i=0;i<(int)num.size();i++)
{
map.insert(num[i]);
}
int longest = 0;
for(int i=0;i<(int)num.size();i++)
{
if(map.find(num[i]) == map.end())
continue;
map.erase(num[i]);
int subSeq = 1;
int n = num[i]-1;
while(map.find(n)!=map.end())
{
subSeq++;
map.erase(n);
n--;
}
n = num[i]+1;
while(map.find(n)!=map.end())
{
subSeq++;
map.erase(n);
n++;
}
if(longest < subSeq)
longest = subSeq;
}
return longest;
}
int main(void)
{
vector<int> num;
num.push_back(100);
num.push_back(4);
num.push_back(200);
num.push_back(1);
num.push_back(3);
num.push_back(2);
cout << longestConsecutive(num) << endl;
system("pause");
return 0;
}