关于set的算法

时间复杂度

访问:无访问这个概念
搜索:平常为O(1),如果有哈希冲突则为O(K),K是链表元素长度
删除:平常为O(1),如果有哈希冲突则为O(K),K是链表元素长度
插入:平常为O(1),如果有哈希冲突则为O(K),K是链表元素长度

练习题

  1. 217重复数据

解法一

解题思路

直接使用set去重后比较两个数据的前后长度即可

代码

class Solution:
    def containsDuplicate(self, nums: List[int]) -> bool:
        return len(set(nums)) == len(nums)
  1. 设计哈希集合

解法一

解题思路

使用超级大的数组,因为这个题目中有个已知条件: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)
posted @ 2022-08-10 11:09  影梦无痕  阅读(36)  评论(0)    收藏  举报