[LeetCode] Longest Consecutive Sequence

来源:互联网 发布:淘宝优5元惠券模板 编辑:程序博客网 时间:2024/06/06 04:55

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),不满足要求,于是,在遍历某个成员的前后成员时,遍历之后就将该成员从哈希表中移除,可以理解为对于数组中的某个连续序列,从其中任何一个开始遍历所得到的长度是一样的。


0 0
原创粉丝点击