Leetcode 128 Longest Consecutive Sequence

一个小技巧:涉及到O(n)时间,并且还是unordered的东西,可以考虑一下Hash。

对于本题而言,如果是O(n*logn)的时间,还是很好做的——先排序,然后检查。那么,能否用O(n)的时间来做呢?

我们可以用一个HashTable来将所有的数据存储起来。关键问题是,我们如何用O(1)时间来判断连续性?或者说,对于n个元素,查找连续序列的时间能否也是O(n)?从某个元素开始递增寻找?那时间又成了O(n*n)。

这里有一个不太容易想到的思路,那就是:从当前元素递减寻找,从当前元素+1递增寻找,这样一次就能够把连续序列找全。找全后,别忘记清空元素,保证下次不会重复寻找,以减少重复搜寻的次数。

以后涉及到“在未排序集合中寻找有序集合”的题目,可以考虑本题的思路!


reference: http://blog.sina.com.cn/s/blog_b9285de20101iqar.html

class Solution
{
public:
    int Consecutives(unordered_multimap<int, int>& intmap, int element,
			bool isAscending)
	{
		int count = 0;
		while (intmap.count(element) > 0)
		{
			count++;
			intmap.erase(element);
			if (isAscending)
				element++;
			else
				element--;
		}
		return count;
	}
	int longestConsecutive(vector<int> &arr)
	{
		if (arr.size() == 0)
			return 0;
		unordered_multimap<int, int> intmap;
		int maxcount = 0;
		for (int i = 0; i < arr.size(); i++)
			intmap.emplace(arr[i], arr[i]);

		for (int i = 0; i < arr.size(); i++)
		{
			if (intmap.count(arr[i]) > 0)
				maxcount = max(maxcount,
						Consecutives(intmap, arr[i], false)
								+ Consecutives(intmap, arr[i] + 1, true));
		}
		return maxcount;

	}
};


你可能感兴趣的:(Leetcode 128 Longest Consecutive Sequence)