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),所以不行!这题可以使用到关联容器的知识(见博客关联容器详解(一))。然后就涉及选择容器的问题了,是选择有序的set,还是无序的unordered_set(当然可以使用map类的)?因为set会直接给元素进行排序,其原理涉及平衡搜索二叉树(即红黑树),时间复杂度不满足。所以这里利用unordered_set。大致的思路是:从头到尾遍历数组,若某数在set中,则遍历其左右两边的数(注意,这里是数组存放的值不是下标),并删除该数。找到目前的最大长度,在继续访问数组中的元素。代码如下:
1 class Solution {
2 public:
3 int longestConsecutive(vector<int> &num)
4 {
5 int res=0;
6 unordered_set<int> s(num.begin(),num.end());
7
8 for(int i=0;i<num.size();++i)
9 {
10 if(s.count(num[i]))
11 {
12 s.erase(num[i]);
13 int pre=num[i]-1,next=num[i]+1;
14 while(s.count(pre))
15 s.erase(pre--);
16 while(s.count(next))
17 s.erase(next++);
18
19 res=max(res,next-pre-1);
20 }
21 }
22 return res;
23 }
24 };
关于unordered_map的使用方法可以参见Grandyang的博客。