Given an unsorted array ofintegers, 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.
解题思路:
O(n)的复杂度的基本上想到hash,此题的主要思路是数组的每个元素加入到一个hash_map当中,然后其中的元素做向上递增以及向下递减,直到递增或递减的数据在hash_map中不存在(即表明数组中没有这个数值),需要注意的是为了防止重复计算,将已经递减过或递增过的数值需要删除,以防止遍历数组的时候重复计算做无用功。
代码:
int longestConsecutive(vector<int> &num) {
if(num.empty())
return 0;
unordered_map<int,int> ma;
int max_length = 1;
for(int i=0; i!=num.size(); i++)
{
ma[num[i]] = 1;
};
for(int i=0; i!=num.size(); i++)
{
if(ma[num[i]] != 0)
{
int tmp_1 = num[i];
int tmp_2 = num[i];
int count_1 = 1;
int count_2 = 1;
while(ma[tmp_1+1])
{
count_1++;
tmp_1 = tmp_1 + 1;
ma[tmp_1] = 0;
}
while(ma[tmp_2-1])
{
count_2++;
tmp_2 = tmp_2 - 1;
ma[tmp_2] = 0;
}
if(count_1+count_2-1 > max_length)
max_length = count_1+count_2-1;
}
}
return max_length;
}