1. 题目描述
给定一个未排序的整数数组,找出最长连续序列的长度。
要求算法的时间复杂度为 O(n)。
示例:
输入: [100, 4, 200, 1, 3, 2]
输出: 4
解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为 4。
2. 解题思路
题目要求算法时间复杂度为 O(n),所以不能排序,因为排序算法的时间复杂度至少为 O(nlogn).
然后想到用字典。
第一步,set去重,重复的数字不能构成连续的序列
第二步,用字典存储左右两端对应连续区间的长度。为什么记录左右两端??中间不需要记录?因为中间的值已经判断过了,只需在左右两端记录连续序列的长度。
如果思路很难看懂,就自己把 [100, 4, 200, 1, 3, 2]例子放进代码里手算一遍,用笔在纸上画一画,很容易明白的。
3. 代码实现
class Solution:
def longestConsecutive(self, nums) -> int:
setNums = set(nums)
hash_dict = {}
maxLength = 0
for num in setNums:
if(num not in hash_dict):
left = hash_dict.get(num - 1, 0)
right = hash_dict.get(num + 1, 0)
curLength = 1 + left + right
maxLength = max(curLength,maxLength)
hash_dict[num] = curLength
hash_dict[num-left] = curLength
hash_dict[num + right] = curLength
return maxLength