关于set的算法
时间复杂度
访问:无访问这个概念
搜索:平常为O(1),如果有哈希冲突则为O(K),K是链表元素长度
删除:平常为O(1),如果有哈希冲突则为O(K),K是链表元素长度
插入:平常为O(1),如果有哈希冲突则为O(K),K是链表元素长度
练习题
- 217重复数据

解法一
解题思路
直接使用set去重后比较两个数据的前后长度即可
代码
class Solution:
def containsDuplicate(self, nums: List[int]) -> bool:
return len(set(nums)) == len(nums)
- 设计哈希集合

解法一
解题思路
使用超级大的数组,因为这个题目中有个已知条件:0 <= key <= 10^6,所以我们可以把这些值直接看成超大list的下标。
代码
class MyHashSet:
def __init__(self):
self.hash_list = [False] * 1000001
def add(self, key: int) -> None:
self.hash_list[key] = True
def remove(self, key: int) -> None:
self.hash_list[key] = False
def contains(self, key: int) -> bool:
return self.hash_list[key]
# Your MyHashSet object will be instantiated and called as such:
# obj = MyHashSet()
# obj.add(key)
# obj.remove(key)
# param_3 = obj.contains(key)
解法二
解题思路
已知条件0 <= key <= 10^6,说明这里面都是存储的数字,既然是数字,那么每个数字的尾数的范围是0-9。所以我们这里可以创建一个二维数组或者使用数组+链表的方式解答。内部数组(链表)可以直接记录其原始值,而外围数组则是尾号。
代码
class MyHashSet:
def __init__(self):
self.hash_list = [[] for _ in range(10)]
def hash(self, key: int) -> int:
return int(str(key)[-1])
def add(self, key: int) -> None:
hash_key = self.hash(key)
if key in self.hash_list[hash_key]:
return
self.hash_list[hash_key].append(key)
def remove(self, key: int) -> None:
hash_key = self.hash(key)
if key in self.hash_list[hash_key]:
self.hash_list[hash_key].remove(key)
def contains(self, key: int) -> bool:
hash_key = self.hash(key)
return key in self.hash_list[hash_key]
# Your MyHashSet object will be instantiated and called as such:
# obj = MyHashSet()
# obj.add(key)
# obj.remove(key)
# param_3 = obj.contains(key)

浙公网安备 33010602011771号