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(n) ,使用排序会超时。
思索未果,再网上找到一个方案,借助 unordered_set 来实现。
将元素全部塞进 unordered_set 中。
取出 unordered_set 中的一个剩余元素 x ,找到 unordered_set 中 x 的全部前后相邻元素,并将 x 和相邻元素全部移除,此时能得到 x 的相邻长度。若 unordered_set 还有元素,则继续当前步骤。
在第二步中的所有相邻长度中,找出最大值便是原问题的解。
由于 unordered_set 是基于 hash_table 来实现的,所以每次插入、查找、删除都是 O(1),而全部元素只会 插入、查找、删除 1 次,所以整体复杂度是 O(n)。
1 int longestConsecutive(vector<int>& nums) { 2 3 unordered_set<int> theSet; 4 for (int i = 0 ; i < nums.size(); i++) { 5 theSet.insert(nums[i]); 6 } 7 8 int longest = 0; 9 while (theSet.size() > 0 ) { 10 11 int tmp = *theSet.begin(); 12 theSet.erase(tmp); 13 14 int cnt = 1; 15 16 int tmpR = tmp + 1; 17 while (theSet.count(tmpR)) { 18 cnt++; 19 theSet.erase(tmpR); 20 tmpR++; 21 } 22 23 int tmpL = tmp - 1; 24 while (theSet.count(tmpL)) { 25 cnt++; 26 theSet.erase(tmpL); 27 tmpL--; 28 } 29 30 longest = max( longest, cnt); 31 32 } 33 34 return longest; 35 }
参考资料: