1、题目描述
https://leetcode-cn.com/problems/single-number/
给定一个未排序的整数数组,找出最长连续序列的长度。要求算法的时间复杂度为 O(n)。
输入: [100, 4, 200, 1, 3, 2]
输出: 4
解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为 4。
2、代码详解
解题思路:dict模拟哈希表,题目要求 O(n)复杂度。
用哈希表存储每个端点值对应连续区间的长度
若数已在哈希表中:跳过不做处理
若是新数加入:
- 取出其左右相邻数已有的连续区间长度 left 和 right
- 计算当前数的区间长度为:cur_length = left + right + 1
- 根据 cur_length 更新最大长度 max_length 的值
- 更新区间两端点的长度值
get() 函数返回指定键的值,如果键不在字典中返回默认值。
dict.get(key, default=None)
class Solution(object):
def longestConsecutive(self, nums):
hash_dict = dict() # 哈希表存储每个端点值对应连续区间的长度
max_length = 0
for num in nums:
# 若数已在哈希表中:跳过不做处理
# 若是新数加入
if num not in hash_dict: # 保证了left和right不会有交叠 进来的这个值没有在字典中出现过,意味着目前还没有任何区间包含这个值
# 取出其左右相邻数已有的连续区间长度 left 和 right
left = hash_dict.get(num - 1, 0) # dict.get(key, default=None)如果键不在字典中返回默认值
right = hash_dict.get(num + 1, 0)
cur_length = 1 + left + right # 计算当前数的区间长度为:cur_length = left + right + 1
# print('num:', num, ',left:', left, ',right:', right, ',cur_length:', cur_length)
# 根据 cur_length 更新最大长度 max_length 的值
if cur_length > max_length:
max_length = cur_length
# 更新区间两端点的长度值
hash_dict[num] = cur_length # 这里不是用于端点记录的,而是标记num已经在hash中,所以可以是随便一个值
hash_dict[num - left] = cur_length
hash_dict[num + right] = cur_length
return max_length
输入: [100, 4, 200, 1, 3, 2]
输出: 4 解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为 4。