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; } };