题意:求一个未排序的整型数组中最长连续序列的长度,要求时间复杂度为O(n)
如输入[100,4,200,2,3,1],最长连续序列是[1,2,3,4],长度为4
思路:一般的思路是先排序,再统计,但通常快排的时间复杂度为O(n*logn)。我们想到计数排序,时间排序度为O(n)。计数排序要用到一个额外的数组,必须知道数值的范围。但int类型的范围显然太大,于是我们想到哈希表。事实上,涉及到O(n)时间,并且还是unordered的东西,可以考虑一下Hash。
本题先用一个哈希表把数值保存起来。第二次遍历的时候,每找到一个数,从前后两个方向统计连续序列的长度,这样一次就能够把连续序列找全。找全后,别忘记清空元素,保证下次不会重复寻找,以减少重复搜寻的次数。
代码:
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;
}