[LeetCode] Longest Consecutive Sequence

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 hash;
public:
	enum DIRECTION{
		forward, backward
	};

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

		unordered_set::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 &num)
	{
		for(vector::iterator iter = num.begin();
			                      iter != num.end(); ++iter) {
			hash.insert(*iter);
		}

		int len = 0;

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


你可能感兴趣的:(C++,algorithm,leetcode)