leetcode算法热题--最长连续序列
题目
给定一个未排序的整数数组 nums
,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n)
的算法解决此问题。
示例 1:
输入:nums = [100,4,200,1,3,2]
输出:4
解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。
示例 2:
输入:nums = [0,3,7,2,5,8,4,6,0,1]
输出:9
提示:
0 <= nums.length <= 10^5
-10^9 <= nums[i] <= 10^9
题目链接 :https://leetcode.cn/problems/longest-consecutive-sequence/?envType=study-plan-v2&envId=top-100-liked
解答
思路和算法
我们能想到的最简单的方法就是排序,排序之后循环找出最长子序列即可了。但是要保证时间复杂度为O(n)
,一般的排序都不能满足,我们可以使用哈希表来解决这个问题,因为哈希表查找的时间复杂度为O(1)
,所有我们先将数组中的值全部存入哈希表中,随后我们就遍历哈希表,同时计算以当前数向后的最长子序列为多少,当然,如果当前数的前驱数有的话我们就能跳过这个数,因为在它的前驱数就已经计算过最长序列了。
代码
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
unordered_set<int> hash;
//将nums数组元素存入哈希表
for(auto num : nums)
{
hash.insert(num);
}
//最长序列初始化为0
int res = 0;
//遍历哈希表
for(auto num : hash)
{
//判断前驱数
if (!hash.count(num - 1))
{
int currentnum = num;
int tmp = 1;
//寻找以num为起点的最长序列
while(hash.count(currentnum+1))
{
currentnum+=1;
tmp+=1;
}
//选择最长序列
res=max(tmp,res);
}
}
return res;
}
};
复杂度分析
时间复杂度:O(n)
,其中 n
为数组的长度。只有当一个数是连续序列的第一个数的情况下才会进入内层循环,然后在内层循环中匹配连续序列中的数,因此数组中的每个数只会进入内层循环一次。
空间复杂度:O(n)
,哈希表存储数组中所有的数需要 O(n)
的空间。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 我与微信审核的“相爱相杀”看个人小程序副业
· DeepSeek “源神”启动!「GitHub 热点速览」
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库