[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
The longest consecutive elements sequence is
length:
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),不满足要求,于是,在遍历某个成员的前后成员时,遍历之后就将该成员从哈希表中移除,可以理解为对于数组中的某个连续序列,从其中任何一个开始遍历所得到的长度是一样的。
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),不满足要求,于是,在遍历某个成员的前后成员时,遍历之后就将该成员从哈希表中移除,可以理解为对于数组中的某个连续序列,从其中任何一个开始遍历所得到的长度是一样的。
相关文章推荐
- [Leetcode]Longest Consecutive Sequence
- 【LeetCode】Longest Consecutive Sequence 解题报告
- leetcode刷题系列C++-Longest Consecutive Sequence
- [Leetcode]Longest Consecutive Sequence
- [LeetCode]Longest Consecutive Sequence
- LeetCode_Longest Consecutive Sequence
- [LeetCode] Longest Consecutive Sequence
- [leetcode]Longest Consecutive Sequence
- leetcode Longest Consecutive Sequence
- LeetCode 之 Longest Consecutive Sequence
- LeetCode128 Longest Consecutive Sequence
- LeetCode128:Longest Consecutive Sequence
- Leetcode#128 Longest Consecutive Sequence
- LeetCode:Longest Consecutive Sequence
- LeetCode-Longest Consecutive Sequence
- Longest Consecutive Sequence - Leetcode
- Leetcode: Binary Tree Longest Consecutive Sequence
- LeetCode(Longest Consecutive Sequence ) 最长连续序列
- 【leetcode刷题笔记】Longest Consecutive Sequence
- leetcode 128:Longest Consecutive Sequence