频繁查找用哈希,顺序访问用列表
代码比较:
代码片段1
class solu:def missingNumber(self,nums: list) -> int:num_set = []# 将数组中的正整数添加到集合中for num in nums:if num > 0:num_set.append(num)print(num_set)smallest_missing = 1while smallest_missing in num_set:smallest_missing += 1return smallest_missing
s=solu()
print(s.missingNumber([1,2,0]))
和代码片段2
class solu:def missingNumber(self,nums: list) -> int:num_set = set()# 将数组中的正整数添加到集合中for num in nums:if num > 0:num_set.add(num)print(num_set)smallest_missing = 1while smallest_missing in num_set:smallest_missing += 1return smallest_missing
s=solu()
print(s.missingNumber([1,2,0]))
这两个实现的本质区别在于数据结构的选择,这导致了性能上的巨大差异。
核心区别
第一个实现:使用 list(列表)
第二个实现:使用 set(集合)
详细分析
1. 数据结构差异
第一个实现 - 使用列表
num_set = [] # 实际上是列表,变量名有误导性
num_set.append(num)
第二个实现 - 使用集合
num_set = set() # 真正的集合
num_set.add(num)
2. 性能关键:查找操作
while smallest_missing in num_set: # 这一行的性能天差地别!
smallest_missing += 1
对于列表:
element in list 操作的时间复杂度是 O(n)
需要遍历整个列表来查找元素
最坏情况下需要检查所有元素
对于集合:
element in set 操作的时间复杂度是 O(1)
基于哈希表实现,直接定位元素
查找时间基本恒定

总结:在列表和集合中查找数据的区别
列表查找:像在书页中逐行搜索关键词
集合查找:像通过目录直接翻到对应页码
除了集合(set)之外,还有几种数据类型也基于哈希表实现,具有O(1)的查找性能:

核心建议:
需要快速查找时:使用 set 或 dict
需要键值对:使用 dict
只需要成员检查:使用 set
需要顺序访问:使用 list
记住这个规则:"频繁查找用哈希,顺序访问用列表"
