Longest Consecutive Sequence

本文介绍了如何通过哈希表实现O(n)时间复杂度来找出未排序整型数组中的最长连续序列。通过两次遍历数组并利用哈希表记录元素,能够高效地统计连续序列的长度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:求一个未排序的整型数组中最长连续序列的长度,要求时间复杂度为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;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值