集合是一种元素无序的,不重复的数据结构。
集合的访问,搜索,插入与删除:
集合是没有访问操作的,对于搜索,插入与删除,在没有访问冲突的前提下复杂度为O(1)。
python中常用的集合操作:
# create a set
a = set()
# add(insert) element time complexity:O(1)
a.add(1)
a.add(2)
a.add(3)
a.add(3)
print(a) # {1,2,3}
# search element time complexity:O(1
2 in a
# delete element time complexity:O(1)
a.remove(2)
print(s) # {1,3}
# get size time complexity:O(1)
size = len(a)
print(size) # 2
力扣217存在重复元素:
对于这道题,我们前面用哈希表做过一次,现在我们用集合再来做一次。我们创建一个集合,遍历nums存进集合中,由于集合的唯一性,不会存在重复的元素,所以只要集合的长度不等于nums的长度就证明存在重复的元素,十分简单。
class Solution:
def containsDuplicate(self, nums: List[int]):
if len(nums) == 0 and len(nums) == 1:
return False
ht = set() # 创建一个集合
for i in nums: # 把数组nums加入集合中,集合的唯一性导致重复元素只能加一次
ht.add(i)
if len(ht) != len(nums): # 所以只要长度不等就代表有重复元素
return True
else:
return False
# time complexity:O(N) for循环遍历nums存进集合里
# space complexity:O(N) 产生了集合数据结构
力扣705设计哈希集合:
对于这道题,我们采用了一种取巧的方法,定义了一个足够空间的数组,初始化全为false,然后相应的操作我们只改变对应key的value值即可完成对应操作。
class MyHashSet:
def __init__(self):
self.ht = [False]*1000001 # 首先初始化一个数组,含有那么多位的False
def add(self, key: int):
self.ht[key] = True # 增加元素就把key值对应的value改成true代表这个元素存在
def remove(self, key: int):
self.ht[key] = False # 删除就改回false
def contains(self, key: int):
return self.ht[key] # 判断是否存在就返回key对应的value值就行
# time complexity:O(1) 添加删除判断都是直接根据索引进行操作,复杂度O(1)
# space complexity:O(N) 占了1000001个空间