leetcode 705. 設計雜湊集合(python)
阿新 • • 發佈:2018-11-07
不使用任何內建的雜湊表庫設計一個雜湊集合
具體地說,你的設計應該包含以下的功能
add(value)
:向雜湊集合中插入一個值。contains(value)
:返回雜湊集合中是否存在這個值。remove(value)
:將給定值從雜湊集合中刪除。如果雜湊集合中沒有這個值,什麼也不做。
示例:
MyHashSet hashSet = new MyHashSet(); hashSet.add(1); hashSet.add(2); hashSet.contains(1); // 返回 true hashSet.contains(3); // 返回 false (未找到) hashSet.add(2); hashSet.contains(2); // 返回 true hashSet.remove(2); hashSet.contains(2); // 返回 false (已經被刪除)
注意:
思路:題目中的值範圍在[1,1000000]之間,我們必須把這些值雜湊開。很自然想到“桶原理”,把值雜湊到一個1000個桶裡邊,每個桶最多也就是1000個數。
- 所有的值都在
[1, 1000000]
的範圍內。 - 操作的總數目在
[1, 10000]
範圍內。 - 不要使用內建的雜湊集合庫。
class MyHashSet: def __init__(self): """ Initialize your data structure here. """ self.buckets = 1000 self.itemsPerBucket = 1001 self.table = [[] for _ in range(self.buckets)] def hash(self, key): return key % self.buckets def pos(self, key): return key // self.buckets def add(self, key): """ :type key: int :rtype: void """ hashkey = self.hash(key) if not self.table[hashkey]: self.table[hashkey] = [0] * self.itemsPerBucket self.table[hashkey][self.pos(key)] = 1 def remove(self, key): """ :type key: int :rtype: void """ hashkey = self.hash(key) if self.table[hashkey]: self.table[hashkey][self.pos(key)] = 0 def contains(self, key): """ Returns true if this set did not already contain the specified element :type key: int :rtype: bool """ hashkey = self.hash(key) return (self.table[hashkey] != []) and (self.table[hashkey][self.pos(key)] == 1) # Your MyHashSet object will be instantiated and called as such: # obj = MyHashSet() # obj.add(key) # obj.remove(key) # param_3 = obj.contains(key)