🧾题目描述
给定一个未排序的整数数组 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
示例 3:
输入:nums = [1,0,1,2] 输出:3
✅解题思路
🔥 关键词:哈希表 + 贪心起点判断
🚀核心逻辑:
我们使用一个哈希集合 set(nums)
来快速判断某个数是否存在。对于每个数 x
,我们只在 x-1
不在集合中时开始向后搜索。
这保证了我们只从序列的起点开始扩展,避免了重复搜索。
👣步骤详解:
-
将所有元素加入哈希集合
nums_set
,以支持 O(1) 查询。 -
遍历集合中的每个数:
-
若
x - 1
不在集合中,说明x
是一个连续序列的起点 -
向右扩展,统计连续的
x+1, x+2, ...
是否存在 -
更新最长序列长度
ans
-
✅Python 实现
class Solution:
def longestConsecutive(self, nums: List[int]) -> int:
ans = 0
nums_set = set(nums)
for x in nums_set:
if x - 1 not in nums_set:
cnt = 1
while x + 1 in nums_set:
cnt += 1
x += 1
ans = max(ans, cnt)
return ans
📊复杂度分析
⏱时间复杂度:O(n)
-
每个数最多只被访问一次
-
查找、插入哈希集合的操作为平均
O(1)
-
总体遍历集合
O(n)
,扩展过程中所有数只会被访问一次
🗃️空间复杂度:O(n)
-
额外用了一个
set
存储所有元素