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.
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(nlogn)的复杂度,可以先排序。但显然题目中限制了o(n).这是应该使用hash表。
使用一个hash表unordered_map<int,bool> used记录每个元素是否使用,利用hash表可以按照关键字有序遍历的特性,对每个元素,以该元素为中心,左右扩张,直到不连续为止,记录下最长的记录。
class Solution{
public:
static int longestConsecutive(const vector<int> &num){
unordered_map<int,bool> used;//这里也可以用map。
for (unsigned int i = 0;i < num.size();++i)
used[num[i]] = false;
int longest = 0;
for (unsigned int i =0;i < num.size();i++)
{
int value = num[i];
if (used[value]) continue;
int length = 1;
used[value] = true;
//哈希表是按照关键字有序遍历的。从当前字,左右扩张,找出最大的长度。
for (int j = value + 1;used.find(j) != used.end();++j)
{
used[j] = true;
++length;
}
for(int j = value -1;used.find(j) != used.end();--j)
{
used[j] = true;
++length;
}
longest = max(longest,length);
}
return longest;
}
};