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),不满足要求,于是,在遍历某个成员的前后成员时,遍历之后就将该成员从哈希表中移除,可以理解为对于数组中的某个连续序列,从其中任何一个开始遍历所得到的长度是一样的。
[LeetCode] Longest Consecutive Sequence,布布扣,bubuko.com
[LeetCode] Longest Consecutive Sequence
原文:http://blog.csdn.net/luofengmacheng/article/details/23163185