难度:中等
给定一个未排序的整数数组
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 <= 105
-109 <= nums[i] <= 109
分析:
- 本地难点在于要求:时间复杂度为
O(n)
。如果没有这个要求,先对数组排序,然后就非常容易查找最长连续序列。 - 既然不能排序,当前数 x,借助什么结构判断 x+1 是否存在 ?当然是集合。
- 如果 x + 1 存在,那么 x + 2 呢、x + 3 呢…
- 注意:这里有一个误区容易陷阱去。在判断是否连续时,总想在原有数组中查找,而不是构造出 x + k,是否存在。
时间复杂度分析:
- 外层循环需要 O(n) 的时间复杂度,只有当一个数是连续序列的第一个数的情况下才会进入内层循环,然后在内层循环中匹配连续序列中的数,因此数组中的每个数只会进入内层循环一次。根据上述分析可知,总时间复杂度为 O(n),符合题目要求。
def longestConsecutive(self, nums):
m = set([item for item in nums])
res = 0
for item in nums:
# 剪枝优化,如果存在连续的更小的数,那么 (item - 1)一定不是最优解
if item - 1 in m: continue
count = 1
tmp = item + 1
while tmp in m:
count += 1
tmp += 1
res = max(res,count)
return res
```