您的位置:首页 > 产品设计 > UI/UE

在无序序列中找出最长的连续序列 Longest Consecutive Sequence

2014-03-03 22:23 459 查看
问题: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.

思路:要求了线性的时间复杂度。所以不能排序了。但是不统计整理一下数据,怎么能知道是否连续的,所以只能是hash了。这里我用的是map来当hash用。用Hash把数据整理过之后。就要找连续序列了。

对于一个数,看它相邻的数在不在hash里,要比看hash里的数是否相邻,要快要简单。这是一种思路的转变。即,看到一个数,就尝试对其左右扩张,看是否在数组中。

代码:为了避免重复对连续序列进行统计,map的second字段用于记录是否访问过。

class Solution {
public:
int longestConsecutive(vector<int> &num) {
int n = num.size();
if(n == 0)
return 0;
int maxlen = 0;
map<int, bool> m;
for(int i=0;i<n;i++)
m.insert(pair<int, bool>(num[i], true));

map<int, bool>::iterator it = m.begin();
for(;it!=m.end();it++)
{
int now = (*it).first;
if((*it).second == true)
{
int len = 1;
int i=1;
while(m.find(now+i) != m.end())
{
(*m.find(now+i)).second = false;
i++;
len++;
}
i = 1;
while(m.find(now-i) != m.end())
{
(*m.find(now-i)).second = false;
i--;
len++;
}
if(len > maxlen)
maxlen = len;
}
}
return maxlen;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: