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

[LeetCode] Longest Consecutive Sequence

2014-04-08 09:46 323 查看
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(nlogn),因此,不能用排序。

由于要查找连续的序列,对于某一个整数,可以查看它的前一个整数和后一个整数是否在数组中,如果在,就查找下一个,但是,要判断一个整数是否在数组中需要遍历整个数组,复杂度又提高了,解决的办法是用空间换时间,采用哈希表,初始时将整数都存储在哈希表中,那么,查找时就只需要O(1)的时间复杂度了。

class Solution {
unordered_set<int> hash;
public:
enum DIRECTION{
forward, backward
};

int find_consecutive(int cur, DIRECTION dir)
{
int len = 0;

unordered_set<int>::iterator iter;
while((iter = hash.find(cur)) != hash.end()) {
++len;
hash.erase(iter);
if(dir == forward) {
++cur;
}
else if(dir == backward) {
--cur;
}
}

return len;
}

int longestConsecutive(vector<int> &num)
{
for(vector<int>::iterator iter = num.begin();
iter != num.end(); ++iter) {
hash.insert(*iter);
}

int len = 0;

for(vector<int>::iterator iter = num.begin();
iter != num.end(); ++iter) {
len = max(find_consecutive(*iter, forward) + find_consecutive(*iter - 1, backward), len);
}

return len;
}
};

下面分析算法的时间复杂度:

先将整数都存储在哈希表中,时间复杂度是O(n)。然后依次遍历数组中的每个成员,对每个成员所在的连续序列而言,查找的时间复杂度是O(1),如果每个成员所在的连续序列的平均长度是L,那么,总的时间复杂度是O(n) + O(n) * O(1) * O(L),如果L = n,那么时间复杂度就变成了O(n^2),不满足要求,于是,在遍历某个成员的前后成员时,遍历之后就将该成员从哈希表中移除,可以理解为对于数组中的某个连续序列,从其中任何一个开始遍历所得到的长度是一样的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  algorithm leetcode