一、题目描述:
给定一个未排序的整数数组 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
提示:
0 <= nums.length <= 105
-109 <= nums[i] <= 109
解法1:
思路:
1、先将列表使用sort()函数排序得到新列表sort_list
2、创建空字典hash_table(哈希表)
3、从头遍历新列表sort_list
4、如果遍历到的数字n-1不在hash_table里,hash_table[n] = 1;如果遍历到的数字n-1在hash_table里,hash_table[n] = hash_table[n-1] + 1
5、输出字典中最大的value值
class Solution:
def longestConsecutive(self, nums: List[int]) -> int:
sorted_list = sorted(nums)
hash_table = {}
for n in sorted_list:
if n-1 not in hash_table:
hash_table[n] = 1
else:
hash_table[n] = hash_table[n-1] + 1
return max(list(hash_table.values()))
解法1存在如下问题:
1、时间复杂度不满足要求
题目要求时间复杂度为 O(n),但 sorted() 的时间复杂度是 O(n log n)。
2、未处理空数组
当输入 nums 为空时,max(list(hash_table.values())) 会抛出 ValueError。
3、重复元素冗余操作
排序后重复元素会导致哈希表的重复写入,虽然不影响结果,但效率降低。
解法2:
使用set()函数去重优化解法1后的解法:
class Solution:
def longestConsecutive(self, nums: List[int]) -> int:
if len(nums) == 0:
return 0
else:
sorted_list = sorted(list(set(nums)))# set去重
hash_table = {}
for n in sorted_list:
if n-1 not in hash_table:
hash_table[n] = 1
else:
hash_table[n] = hash_table[n-1] + 1
return max(list(hash_table.values()))
二、补充知识点:
1、set()函数
set() 是 Python 中用于创建集合(Set)的内置函数。集合是一种无序、不重复元素的容器,常用于快速查找、去重和集合运算。以下是详细解释:
- 集合的特性
- 创建集合
方法 1:直接使用花括号 {}
my_set = {1, 2, 3}
print(type(my_set)) # 输出:<class 'set'>
方法 2:使用 set() 函数
my_set = set([1, 2, 2, 3]) # 从列表转换
print(my_set) # 输出:{1, 2, 3}
my_set = set("hello") # 从字符串转换
print(my_set) # 输出:{'h', 'e', 'l', 'o'}(去重后)
- 在算法中的应用场景
(1) 去重
nums = [1, 2, 2, 3, 3]
unique_nums = list(set(nums)) # 去重后:[1, 2, 3]
(2) 快速查找元素是否存在
# 查找列表中的元素(时间复杂度 O(n))
if target in my_list: ...
# 查找集合中的元素(时间复杂度 O(1))
if target in my_set: ...
(3) 集合运算
# 找出两个列表的交集
list1 = [1, 2, 3]
list2 = [2, 3, 4]
common = set(list1) & set(list2) # {2, 3}
注意使用set([2,1,3])输出结果不一定是(1,2,3)!!!
集合的特性
(1) 无序性
集合中的元素没有固定顺序,因此输出顺序可能与输入顺序不同:
print(set([2, 1, 3])) # 可能输出 {1, 2, 3} 或 {2, 1, 3} 等
(2) 元素唯一性
集合会自动去除重复元素:
set([2, 2, 1, 3]) # 输出:{1, 2, 3}
(3) 高效查找
集合基于哈希表实现,检查元素是否存在的时间复杂度为 O(1):
my_set = set([2, 1, 3])
print(2 in my_set) # 输出:True(极快!)