Longest Consecutive Sequence
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.
思路:
题目的困难之处在于,要求O(n)的时间复杂度。这样对每个数字的查询,插入,删除都必须是O(1)的水平。满足这个条件的就是unordered_set这种基于hash的容器了。首先选择一个数字,然后向左向右拓展成一个区间,直到区间左右的数字都不在给定的数组内。最后测量区间的长度,找到最长的区间。
题解:
class Solution {
public:
int longestConsecutive(vector<int> &num) {
unordered_set<int> hash_num;
for(auto& n : num)
hash_num.insert(n);
int max_len = 0;
while(!hash_num.empty())
{
int num = *begin(hash_num);
hash_num.erase(begin(hash_num));
int left = num;
int right = num;
auto liter = hash_num.find(left - 1);
while(liter != hash_num.end())
{
hash_num.erase(liter);
left -= 1;
liter = hash_num.find(left - 1);
}
auto riter = hash_num.find(right + 1);
while(riter != hash_num.end())
{
hash_num.erase(riter);
right += 1;
riter = hash_num.find(right + 1);
}
max_len = max(max_len, right - left + 1);
}
return max_len;
}
};