[LeetCode] 128. 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(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     }

参考资料:

[LeetCode] Longest Consecutive Sequence, 喜刷刷

 

posted @ 2015-12-28 00:54  TonyYPZhang  阅读(1368)  评论(0编辑  收藏  举报