算法:最长连续序列

给定一个未排序的整数数组,目标是找出最长连续序列的长度。文章详细分析了从暴力解法到优化解法的过程,通过哈希表在O(n)时间复杂度内解决此问题。

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

题目:最长连续序列

给定一个未排序的整数数组,找出最长连续序列的长度。

要求算法的时间复杂度为 O(n)。

示例:

输入: [100, 4, 200, 1, 3, 2]
输出: 4
解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为 4。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-consecutive-sequence

分析

找到一组数的集合,我们想一下可能有的方法,动态规划?貌似没有状态转移方程可以写;滑动窗口?他不是连续的子数组。

首先依然是暴力:遍历每个数,找到每个数的时候,再遍历数组看看有没有下个数,然后再遍历,再看看有没有下个数,三次循环就可以得到以每个数为起点的最长字段。ok我们发现,复杂度是O(n^3)。这是不可接受的。然后我们来进行优化。

我们在查找每个数的下继,例如得到2 ,那我们就要看看有没有3。这种情况能不能进行优化?答案是可以的,用哈希表。我们把每个数当成key值放进哈希表,然后只要直接查询该数是否存在即可。哈希表的查询复杂度是O(1)所以这里就降低成为了O(n^2)。显然还不够,我们继续优化。

我们会发现,如果存在2,3,4,5这个集合,那么我们会轮流都去以2,3,4,5为最小值去寻找最长字符串。例如一个数组是[2,3,4,5]。第一次在下标0得到2,然后继续寻找直到得到2,3,4,5.然后第二次来到下标1得到3,我们会继续去寻

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值